From ba1b5a77d8cac325a2a8f89ec261616e298045d1 Mon Sep 17 00:00:00 2001 From: Andre Maroneze <andre.oliveiramaroneze@cea.fr> Date: Mon, 20 Jan 2020 19:05:15 +0100 Subject: [PATCH] [Eva] add typing checks for malloc builtins; fix some tests --- src/plugins/value/domains/cvalue/builtins.ml | 4 +- .../value/domains/cvalue/builtins_malloc.ml | 35 ++++++-- .../builtins/{malloc-deps.i => malloc-deps.c} | 8 +- tests/builtins/malloc-optimistic.c | 4 +- tests/builtins/malloc.c | 6 +- tests/builtins/malloc_memexec.c | 6 +- tests/builtins/memexec-malloc.c | 6 +- tests/builtins/oracle/malloc-deps.res.oracle | 86 +++++++++---------- .../builtins/oracle/memexec-malloc.res.oracle | 63 +++++++------- 9 files changed, 119 insertions(+), 99 deletions(-) rename tests/builtins/{malloc-deps.i => malloc-deps.c} (82%) diff --git a/src/plugins/value/domains/cvalue/builtins.ml b/src/plugins/value/domains/cvalue/builtins.ml index 2465cf27635..f521fcac3b7 100644 --- a/src/plugins/value/domains/cvalue/builtins.ml +++ b/src/plugins/value/domains/cvalue/builtins.ml @@ -149,8 +149,10 @@ let prepare_builtin kf builtin_name builtin expected_typ = then Value_parameters.warning ~source ~once:true ~wkey:Value_parameters.wkey_builtins_override - "The builtin %s will not be used for function %a of incompatible type." + "The builtin %s will not be used for function %a of incompatible type.@ \ + (got: %a)." builtin_name Kernel_function.pretty kf + Printer.pp_typ (Kernel_function.get_type kf) else match find_builtin_specification kf with | None -> diff --git a/src/plugins/value/domains/cvalue/builtins_malloc.ml b/src/plugins/value/domains/cvalue/builtins_malloc.ml index 7c83a1be556..2efd15c1339 100644 --- a/src/plugins/value/domains/cvalue/builtins_malloc.ml +++ b/src/plugins/value/domains/cvalue/builtins_malloc.ml @@ -354,8 +354,14 @@ let alloc_fresh ?(prefix="malloc") weak region state actuals = } | _ -> raise (Builtins.Invalid_nb_of_args 1) -let () = Builtins.register_builtin "Frama_C_malloc_fresh" (alloc_fresh Strong Base.Malloc) -let () = Builtins.register_builtin "Frama_C_malloc_fresh_weak" (alloc_fresh Weak Base.Malloc) +let () = + Builtins.register_builtin "Frama_C_malloc_fresh" + (alloc_fresh Strong Base.Malloc) + ~typ:(fun () -> (Cil.voidPtrType, [Cil.theMachine.Cil.typeOfSizeOf])) +let () = + Builtins.register_builtin "Frama_C_malloc_fresh_weak" + (alloc_fresh Weak Base.Malloc) + ~typ:(fun () -> (Cil.voidPtrType, [Cil.theMachine.Cil.typeOfSizeOf])) let alloc_size_ok intended_size = try @@ -404,8 +410,14 @@ let calloc_abstract calloc_f state actuals = let calloc_fresh weak state actuals = calloc_abstract (alloc_abstract weak Base.Malloc) state actuals -let () = Builtins.register_builtin "Frama_C_calloc_fresh" (calloc_fresh Strong) -let () = Builtins.register_builtin "Frama_C_calloc_fresh_weak" (calloc_fresh Weak) +let () = + Builtins.register_builtin "Frama_C_calloc_fresh" (calloc_fresh Strong) + ~typ:(fun () -> (Cil.voidPtrType, [Cil.theMachine.Cil.typeOfSizeOf; + Cil.theMachine.Cil.typeOfSizeOf])) +let () = + Builtins.register_builtin "Frama_C_calloc_fresh_weak" (calloc_fresh Weak) + ~typ:(fun () -> (Cil.voidPtrType, [Cil.theMachine.Cil.typeOfSizeOf; + Cil.theMachine.Cil.typeOfSizeOf])) (* Variables that have been returned by a call to an allocation function at this callstack. The first allocated variable is at the top of the @@ -493,12 +505,15 @@ let alloc_by_stack ?(prefix="malloc") region ?returns_null : Db.Value.builtin = ;; let () = Builtins.register_builtin ~replace:"malloc" "Frama_C_malloc_by_stack" (alloc_by_stack Base.Malloc) + ~typ:(fun () -> (Cil.voidPtrType, [Cil.theMachine.Cil.typeOfSizeOf])) let () = Builtins.register_builtin ~replace:"__fc_vla_alloc" "Frama_C_vla_alloc_by_stack" (alloc_by_stack Base.VLA ~returns_null:false) + ~typ:(fun () -> (Cil.voidPtrType, [Cil.theMachine.Cil.typeOfSizeOf])) let () = Builtins.register_builtin ~replace:"alloca" "Frama_C_alloca" (alloc_by_stack ~prefix:"alloca" Base.Alloca ~returns_null:false) + ~typ:(fun () -> (Cil.voidPtrType, [Cil.theMachine.Cil.typeOfSizeOf])) (* Equivalent to [alloc_by_stack], but for [calloc]. *) let calloc_by_stack : Db.Value.builtin = fun state actuals -> @@ -506,6 +521,8 @@ let calloc_by_stack : Db.Value.builtin = fun state actuals -> let () = Builtins.register_builtin ~replace:"calloc" "Frama_C_calloc_by_stack" calloc_by_stack + ~typ:(fun () -> (Cil.voidPtrType, [Cil.theMachine.Cil.typeOfSizeOf; + Cil.theMachine.Cil.typeOfSizeOf])) (** {1 Free} *) @@ -614,7 +631,9 @@ let frama_c_free state actuals = } | _ -> raise (Builtins.Invalid_nb_of_args 1) -let () = Builtins.register_builtin ~replace:"free" "Frama_C_free" frama_c_free +let () = + Builtins.register_builtin ~replace:"free" "Frama_C_free" frama_c_free + ~typ:(fun () -> (Cil.voidType, [Cil.voidPtrType])) (* built-in for [__fc_vla_free] function. By construction, VLA should always be mapped to a single base. *) @@ -633,6 +652,7 @@ let frama_c_vla_free state actuals = let () = Builtins.register_builtin ~replace:"__fc_vla_free" "Frama_C_vla_free" frama_c_vla_free + ~typ:(fun () -> (Cil.voidType, [Cil.voidPtrType])) let free_automatic_bases stack state = (* free automatic bases that were allocated in the current function *) @@ -792,9 +812,12 @@ let realloc ~multiple state args = match args with let () = Builtins.register_builtin ~replace:"realloc" "Frama_C_realloc" (realloc ~multiple:false) + ~typ:(fun () -> (Cil.voidPtrType, [Cil.voidPtrType; + Cil.theMachine.Cil.typeOfSizeOf])) let () = Builtins.register_builtin "Frama_C_realloc_multiple" (realloc ~multiple:true) - + ~typ:(fun () -> (Cil.voidPtrType, [Cil.voidPtrType; + Cil.theMachine.Cil.typeOfSizeOf])) (** {1 Leak detection} *) diff --git a/tests/builtins/malloc-deps.i b/tests/builtins/malloc-deps.c similarity index 82% rename from tests/builtins/malloc-deps.i rename to tests/builtins/malloc-deps.c index 9c514cf7f03..a50b7e99b2f 100644 --- a/tests/builtins/malloc-deps.i +++ b/tests/builtins/malloc-deps.c @@ -1,15 +1,15 @@ /* run.config* OPT: -eva @EVA_CONFIG@ -deps -calldeps -inout -slevel 5 -eva-msg-key malloc */ +#include <stddef.h> //@ assigns \result \from \nothing; -void *Frama_C_malloc_fresh(unsigned long n); +void *Frama_C_malloc_fresh(size_t n); //@ assigns \result \from \nothing; -void *Frama_C_malloc_fresh_weak(unsigned long n); +void *Frama_C_malloc_fresh_weak(size_t n); //@ assigns \result \from \nothing; -void *Frama_C_malloc_by_stack(unsigned long n); +void *Frama_C_malloc_by_stack(size_t n); volatile int v; - void g(int *p, int k) { p[k] = k; } void main(int i, int j) { diff --git a/tests/builtins/malloc-optimistic.c b/tests/builtins/malloc-optimistic.c index bb1e66301f3..1d1afd57f2a 100644 --- a/tests/builtins/malloc-optimistic.c +++ b/tests/builtins/malloc-optimistic.c @@ -1,9 +1,9 @@ /* run.config* STDOPT: +"-slevel 30 -eva-slevel-merge-after-loop @all -eva-malloc-functions malloc -eva-memexec" */ - +#include <stddef.h> //@ assigns \result \from \nothing; -void *malloc(unsigned long size); +void *malloc(size_t size); //@ assigns \nothing; frees p; void free(void *p); diff --git a/tests/builtins/malloc.c b/tests/builtins/malloc.c index eb00026fa89..c62203fa9dd 100644 --- a/tests/builtins/malloc.c +++ b/tests/builtins/malloc.c @@ -1,9 +1,9 @@ /* run.config* OPT: -eva @EVA_CONFIG@ -slevel 10 -eva-mlevel 0 */ - -void *Frama_C_malloc_by_stack(unsigned long i); -void *Frama_C_malloc_fresh(unsigned long i); +#include <stddef.h> +void *Frama_C_malloc_by_stack(size_t i); +void *Frama_C_malloc_fresh(size_t i); void main(int c) { int x; diff --git a/tests/builtins/malloc_memexec.c b/tests/builtins/malloc_memexec.c index 463f80de13f..2a0434c0085 100644 --- a/tests/builtins/malloc_memexec.c +++ b/tests/builtins/malloc_memexec.c @@ -1,12 +1,12 @@ /* run.config* OPT: -eva @EVA_CONFIG@ -eva-memexec -deps -inout -eva-mlevel 0 */ - +#include <stddef.h> //@ assigns \result; -void *Frama_C_malloc_fresh(unsigned long n); +void *Frama_C_malloc_fresh(size_t n); //@ assigns \result; -void *Frama_C_malloc_fresh_weak(unsigned long n); +void *Frama_C_malloc_fresh_weak(size_t n); void f(int *p, int i) { diff --git a/tests/builtins/memexec-malloc.c b/tests/builtins/memexec-malloc.c index 0d3b65f3862..13755b28f84 100644 --- a/tests/builtins/memexec-malloc.c +++ b/tests/builtins/memexec-malloc.c @@ -1,7 +1,7 @@ /* run.config* - STDOPT: #"-eva-malloc-functions alloc,Frama_C_malloc_by_stack -eva-mlevel 0" + STDOPT: #"-eva-malloc-functions alloc -eva-mlevel 0" */ - +#include <stdlib.h> #define N 2000 int t[N]; @@ -12,7 +12,7 @@ void f() { } int *alloc() { - return Frama_C_malloc_by_stack(4); + return malloc(4); } int *k() { diff --git a/tests/builtins/oracle/malloc-deps.res.oracle b/tests/builtins/oracle/malloc-deps.res.oracle index f76d408d0cf..3d9d469a191 100644 --- a/tests/builtins/oracle/malloc-deps.res.oracle +++ b/tests/builtins/oracle/malloc-deps.res.oracle @@ -1,106 +1,106 @@ -[kernel] Parsing tests/builtins/malloc-deps.i (no preprocessing) +[kernel] Parsing tests/builtins/malloc-deps.c (with preprocessing) [eva] Analyzing a complete application starting at main [eva] Computing initial state [eva] Initial state computed [eva:initial-state] Values of globals at initialization v ∈ [--..--] -[eva] tests/builtins/malloc-deps.i:17: Call to builtin Frama_C_malloc_fresh_weak -[eva] tests/builtins/malloc-deps.i:17: +[eva] tests/builtins/malloc-deps.c:17: Call to builtin Frama_C_malloc_fresh_weak +[eva] tests/builtins/malloc-deps.c:17: allocating weak variable __malloc_w_main_l17 -[eva] tests/builtins/malloc-deps.i:21: Call to builtin Frama_C_malloc_fresh -[eva] tests/builtins/malloc-deps.i:21: allocating variable __malloc_main_l21 -[eva] tests/builtins/malloc-deps.i:28: Call to builtin Frama_C_malloc_by_stack -[eva] tests/builtins/malloc-deps.i:28: allocating variable __malloc_main_l28 +[eva] tests/builtins/malloc-deps.c:21: Call to builtin Frama_C_malloc_fresh +[eva] tests/builtins/malloc-deps.c:21: allocating variable __malloc_main_l21 +[eva] tests/builtins/malloc-deps.c:28: Call to builtin Frama_C_malloc_by_stack +[eva] tests/builtins/malloc-deps.c:28: allocating variable __malloc_main_l28 [eva] computing for function g <- main. - Called from tests/builtins/malloc-deps.i:29. -[eva:alarm] tests/builtins/malloc-deps.i:13: Warning: + Called from tests/builtins/malloc-deps.c:29. +[eva:alarm] tests/builtins/malloc-deps.c:13: Warning: out of bounds write. assert \valid(p + k); [eva] Recording results for g [from] Computing for function g [from] Done for function g [eva] Done for function g -[eva] tests/builtins/malloc-deps.i:28: Call to builtin Frama_C_malloc_by_stack -[eva:malloc:weak] tests/builtins/malloc-deps.i:28: +[eva] tests/builtins/malloc-deps.c:28: Call to builtin Frama_C_malloc_by_stack +[eva:malloc:weak] tests/builtins/malloc-deps.c:28: marking variable `__malloc_main_l28' as weak -[eva:malloc] tests/builtins/malloc-deps.i:28: +[eva:malloc] tests/builtins/malloc-deps.c:28: resizing variable `__malloc_w_main_l28' (0..31) to fit 0..63 -[eva:alarm] tests/builtins/malloc-deps.i:29: Warning: +[eva:alarm] tests/builtins/malloc-deps.c:29: Warning: signed overflow. assert l + v ≤ 2147483647; [eva] computing for function g <- main. - Called from tests/builtins/malloc-deps.i:29. + Called from tests/builtins/malloc-deps.c:29. [eva] Recording results for g [from] Computing for function g [from] Done for function g [eva] Done for function g -[eva] tests/builtins/malloc-deps.i:28: Call to builtin Frama_C_malloc_by_stack -[eva:malloc] tests/builtins/malloc-deps.i:28: +[eva] tests/builtins/malloc-deps.c:28: Call to builtin Frama_C_malloc_by_stack +[eva:malloc] tests/builtins/malloc-deps.c:28: resizing variable `__malloc_w_main_l28' (0..31/63) to fit 0..95 [eva] computing for function g <- main. - Called from tests/builtins/malloc-deps.i:29. + Called from tests/builtins/malloc-deps.c:29. [eva] Recording results for g [from] Computing for function g [from] Done for function g [eva] Done for function g -[eva] tests/builtins/malloc-deps.i:28: Call to builtin Frama_C_malloc_by_stack -[eva:malloc] tests/builtins/malloc-deps.i:28: +[eva] tests/builtins/malloc-deps.c:28: Call to builtin Frama_C_malloc_by_stack +[eva:malloc] tests/builtins/malloc-deps.c:28: resizing variable `__malloc_w_main_l28' (0..31/95) to fit 0..127 [eva] computing for function g <- main. - Called from tests/builtins/malloc-deps.i:29. + Called from tests/builtins/malloc-deps.c:29. [eva] Recording results for g [from] Computing for function g [from] Done for function g [eva] Done for function g -[eva] tests/builtins/malloc-deps.i:28: Call to builtin Frama_C_malloc_by_stack -[eva:malloc] tests/builtins/malloc-deps.i:28: +[eva] tests/builtins/malloc-deps.c:28: Call to builtin Frama_C_malloc_by_stack +[eva:malloc] tests/builtins/malloc-deps.c:28: resizing variable `__malloc_w_main_l28' (0..31/127) to fit 0..159 [eva] computing for function g <- main. - Called from tests/builtins/malloc-deps.i:29. + Called from tests/builtins/malloc-deps.c:29. [eva] Recording results for g [from] Computing for function g [from] Done for function g [eva] Done for function g -[eva] tests/builtins/malloc-deps.i:28: Call to builtin Frama_C_malloc_by_stack -[eva:malloc] tests/builtins/malloc-deps.i:28: +[eva] tests/builtins/malloc-deps.c:28: Call to builtin Frama_C_malloc_by_stack +[eva:malloc] tests/builtins/malloc-deps.c:28: resizing variable `__malloc_w_main_l28' (0..31/159) to fit 0..191 [eva] computing for function g <- main. - Called from tests/builtins/malloc-deps.i:29. + Called from tests/builtins/malloc-deps.c:29. [eva] Recording results for g [from] Computing for function g [from] Done for function g [eva] Done for function g -[eva] tests/builtins/malloc-deps.i:27: starting to merge loop iterations -[eva] tests/builtins/malloc-deps.i:28: Call to builtin Frama_C_malloc_by_stack -[eva:malloc] tests/builtins/malloc-deps.i:28: +[eva] tests/builtins/malloc-deps.c:27: starting to merge loop iterations +[eva] tests/builtins/malloc-deps.c:28: Call to builtin Frama_C_malloc_by_stack +[eva:malloc] tests/builtins/malloc-deps.c:28: resizing variable `__malloc_w_main_l28' (0..31/191) to fit 0..191/223 [eva] computing for function g <- main. - Called from tests/builtins/malloc-deps.i:29. + Called from tests/builtins/malloc-deps.c:29. [eva] Recording results for g [from] Computing for function g [from] Done for function g [eva] Done for function g -[eva] tests/builtins/malloc-deps.i:28: Call to builtin Frama_C_malloc_by_stack -[eva:malloc] tests/builtins/malloc-deps.i:28: +[eva] tests/builtins/malloc-deps.c:28: Call to builtin Frama_C_malloc_by_stack +[eva:malloc] tests/builtins/malloc-deps.c:28: resizing variable `__malloc_w_main_l28' (0..31/223) to fit 0..191/255 [eva] computing for function g <- main. - Called from tests/builtins/malloc-deps.i:29. + Called from tests/builtins/malloc-deps.c:29. [eva] Recording results for g [from] Computing for function g [from] Done for function g [eva] Done for function g -[eva] tests/builtins/malloc-deps.i:28: Call to builtin Frama_C_malloc_by_stack -[eva:malloc] tests/builtins/malloc-deps.i:28: +[eva] tests/builtins/malloc-deps.c:28: Call to builtin Frama_C_malloc_by_stack +[eva:malloc] tests/builtins/malloc-deps.c:28: resizing variable `__malloc_w_main_l28' (0..31/255) to fit 0..191/319 [eva] computing for function g <- main. - Called from tests/builtins/malloc-deps.i:29. + Called from tests/builtins/malloc-deps.c:29. [eva] Recording results for g [from] Computing for function g [from] Done for function g [eva] Done for function g -[eva] tests/builtins/malloc-deps.i:28: Call to builtin Frama_C_malloc_by_stack -[eva:malloc] tests/builtins/malloc-deps.i:28: +[eva] tests/builtins/malloc-deps.c:28: Call to builtin Frama_C_malloc_by_stack +[eva:malloc] tests/builtins/malloc-deps.c:28: resizing variable `__malloc_w_main_l28' (0..31/319) to fit 0..191/319 [eva] computing for function g <- main. - Called from tests/builtins/malloc-deps.i:29. + Called from tests/builtins/malloc-deps.c:29. [eva] Recording results for g [from] Computing for function g [from] Done for function g @@ -147,13 +147,13 @@ __malloc_w_main_l28[0..9] FROM v (and SELF) [from] ====== END OF DEPENDENCIES ====== [from] ====== DISPLAYING CALLWISE DEPENDENCIES ====== -[from] call to Frama_C_malloc_fresh_weak at tests/builtins/malloc-deps.i:17 (by main): +[from] call to Frama_C_malloc_fresh_weak at tests/builtins/malloc-deps.c:17 (by main): \result FROM \nothing -[from] call to Frama_C_malloc_fresh at tests/builtins/malloc-deps.i:21 (by main): +[from] call to Frama_C_malloc_fresh at tests/builtins/malloc-deps.c:21 (by main): \result FROM \nothing -[from] call to Frama_C_malloc_by_stack at tests/builtins/malloc-deps.i:28 (by main): +[from] call to Frama_C_malloc_by_stack at tests/builtins/malloc-deps.c:28 (by main): \result FROM \nothing -[from] call to g at tests/builtins/malloc-deps.i:29 (by main): +[from] call to g at tests/builtins/malloc-deps.c:29 (by main): __malloc_w_main_l28[0..9] FROM p; k (and SELF) [from] entry point: __malloc_w_main_l17[0] FROM i; j (and SELF) diff --git a/tests/builtins/oracle/memexec-malloc.res.oracle b/tests/builtins/oracle/memexec-malloc.res.oracle index 7a3b162c3f6..a6ebfd55f71 100644 --- a/tests/builtins/oracle/memexec-malloc.res.oracle +++ b/tests/builtins/oracle/memexec-malloc.res.oracle @@ -1,8 +1,4 @@ [kernel] Parsing tests/builtins/memexec-malloc.c (with preprocessing) -[kernel:typing:implicit-function-declaration] tests/builtins/memexec-malloc.c:15: Warning: - Calling undeclared function Frama_C_malloc_by_stack. Old style K&R code? -[kernel:annot:missing-spec] tests/builtins/memexec-malloc.c:22: Warning: - Neither code nor specification for function Frama_C_malloc_by_stack, generating default assigns from the prototype [eva] Analyzing a complete application starting at main [eva] Computing initial state [eva] Initial state computed @@ -24,15 +20,13 @@ [eva] tests/builtins/memexec-malloc.c:29: Reusing old results for call to f [eva] computing for function alloc <- main. Called from tests/builtins/memexec-malloc.c:31. -[eva] tests/builtins/memexec-malloc.c:15: - Call to builtin Frama_C_malloc_by_stack +[eva] tests/builtins/memexec-malloc.c:15: Call to builtin malloc [eva] tests/builtins/memexec-malloc.c:15: allocating variable __malloc_main_l31 [eva] Recording results for alloc [eva] Done for function alloc [eva] computing for function alloc <- main. Called from tests/builtins/memexec-malloc.c:32. -[eva] tests/builtins/memexec-malloc.c:15: - Call to builtin Frama_C_malloc_by_stack +[eva] tests/builtins/memexec-malloc.c:15: Call to builtin malloc [eva] tests/builtins/memexec-malloc.c:15: allocating variable __malloc_main_l32 [eva] Recording results for alloc [eva] Done for function alloc @@ -40,8 +34,7 @@ Called from tests/builtins/memexec-malloc.c:34. [eva] computing for function alloc <- k <- main. Called from tests/builtins/memexec-malloc.c:19. -[eva] tests/builtins/memexec-malloc.c:15: - Call to builtin Frama_C_malloc_by_stack +[eva] tests/builtins/memexec-malloc.c:15: Call to builtin malloc [eva] tests/builtins/memexec-malloc.c:15: allocating variable __malloc_k_l19 [eva] Recording results for alloc [eva] Done for function alloc @@ -51,8 +44,7 @@ Called from tests/builtins/memexec-malloc.c:35. [eva] computing for function alloc <- k <- main. Called from tests/builtins/memexec-malloc.c:19. -[eva] tests/builtins/memexec-malloc.c:15: - Call to builtin Frama_C_malloc_by_stack +[eva] tests/builtins/memexec-malloc.c:15: Call to builtin malloc [eva] tests/builtins/memexec-malloc.c:15: allocating variable __malloc_k_l19_0 [eva] Recording results for alloc [eva] Done for function alloc @@ -61,57 +53,60 @@ [eva] Recording results for main [eva] done for function main [eva] ====== VALUES COMPUTED ====== -[eva:final-states] Values at end of function alloc: - __retres ∈ - {{ &__malloc_main_l31 ; &__malloc_main_l32 ; &__malloc_k_l19 ; - &__malloc_k_l19_0 }} [eva:final-states] Values at end of function f: t[0..1999] ∈ [0..1999] i ∈ {2000} +[eva:final-states] Values at end of function alloc: + __fc_heap_status ∈ [--..--] [eva:final-states] Values at end of function k: - + __fc_heap_status ∈ [--..--] [eva:final-states] Values at end of function main: + __fc_heap_status ∈ [--..--] t[0..1999] ∈ [0..1999] p1 ∈ {{ &__malloc_main_l31 }} p2 ∈ {{ &__malloc_main_l32 }} p3 ∈ {{ &__malloc_k_l19 }} p4 ∈ {{ &__malloc_k_l19_0 }} -[from] Computing for function alloc -[from] Computing for function Frama_C_malloc_by_stack <-alloc -[from] Done for function Frama_C_malloc_by_stack -[from] Done for function alloc [from] Computing for function f [from] Done for function f +[from] Computing for function alloc +[from] Computing for function malloc <-alloc +[from] Done for function malloc +[from] Done for function alloc [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 Frama_C_malloc_by_stack: - \result FROM x_0 -[from] Function alloc: - \result FROM \nothing [from] Function f: t[0..1999] FROM \nothing (and SELF) +[from] Function malloc: + __fc_heap_status FROM __fc_heap_status; size (and SELF) + \result FROM __fc_heap_status; size +[from] Function alloc: + __fc_heap_status FROM __fc_heap_status (and SELF) + \result FROM __fc_heap_status [from] Function k: - \result FROM \nothing + __fc_heap_status FROM __fc_heap_status (and SELF) + \result FROM __fc_heap_status [from] Function main: + __fc_heap_status FROM __fc_heap_status (and SELF) t[0..1999] FROM \nothing (and SELF) [from] ====== END OF DEPENDENCIES ====== -[inout] Out (internal) for function alloc: - tmp; __retres -[inout] Inputs for function alloc: - \nothing [inout] Out (internal) for function f: t[0..1999]; i [inout] Inputs for function f: \nothing +[inout] Out (internal) for function alloc: + __fc_heap_status; tmp +[inout] Inputs for function alloc: + __fc_heap_status [inout] Out (internal) for function k: - tmp + __fc_heap_status; tmp [inout] Inputs for function k: - \nothing + __fc_heap_status [inout] Out (internal) for function main: - t[0..1999]; p1; p2; p3; p4 + __fc_heap_status; t[0..1999]; p1; p2; p3; p4 [inout] Inputs for function main: - t[1..2] + __fc_heap_status; t[1..2] -- GitLab