Frama-C-discuss mailing list archives
This page gathers the archives of the old Frama-C-discuss archives, that was hosted by Inria's gforge before its demise at the end of 2020. To search for mails newer than September 2020, please visit the page of the new mailing list on Renater.
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Frama-c-discuss] [Value Analysis] multi state propagation
- Subject: [Frama-c-discuss] [Value Analysis] multi state propagation
- From: anne.pacalet at free.fr (Anne Pacalet)
- Date: Tue, 29 Jan 2013 09:33:42 +0100
Hello List, I am trying to use the value analysis to have precise results on an example that is similar to this very simplified one : ------------------------------------------ //@ assigns \nothing; unsigned int ext (void); int N = 0; unsigned int local (void) { unsigned int f = ext (); if (f) N++; Frama_C_dump_each (); return f; } int main (void) { unsigned int f = local (); Frama_C_dump_each (); if (f) N--; //@ assert N == 0; return 0; } ------------------------------------------ Using : frama-c -val test.c -slevel 100 The first Frama_C_dump_each (in 'local') shows that the context is split in two parts : [value] DUMPING STATE of file test.c line 13 N ? {1} f ? [1..4294967295] =END OF DUMP== [value] DUMPING STATE of file test.c line 13 N ? {0} f ? {0} =END OF DUMP== what is exactly what I expected. But unfortunately, it seems that the two states are then merged before being propagated to the 'main' as shown by the second Frama_C_dump_each (in 'main') : [value] DUMPING STATE of file test.c line 19 N ? {0; 1} f ? [--..--] =END OF DUMP== I then get : test.c:20:[value] assigning non deterministic value for the first time test.c:21:[value] Assertion got status unknown. I managed to get the precise result with : $ frama-c -val test.c -slevel 100 -val-split-return-function local:0 [value] DUMPING STATE of file test.c line 19 N ? {0} f ? {0} =END OF DUMP== [value] DUMPING STATE of file test.c line 19 N ? {1} f ? [1..4294967295] =END OF DUMP== test.c:21:[value] Assertion got status valid. But it doesn't scale when the call stack is deeper. What would be great is to be able to specify "something" about either 'ext' (like : ensures f == 0 || f > 0;) or in 'local' (like: ensures (f == 0 && N == \old(N)) || (f > 0 && N == \old(N)+1);) and to tell the analysis that we would like to propagate the two states. Is it possible to do something like that ? Did I missed something ? Thanks in advance for your help. -- Anne.
- Prev by Date: [Frama-c-discuss] Value Analysis plugin versus Simulation Tool
- Next by Date: [Frama-c-discuss] frama-c -wp got stuck
- Previous by thread: [Frama-c-discuss] Value Analysis plugin versus Simulation Tool
- Next by thread: [Frama-c-discuss] frama-c -wp got stuck
- Index(es):