Skip to content
Snippets Groups Projects
Commit 457bf50d authored by Julien Signoles's avatar Julien Signoles
Browse files

Merge branch 'julien/bugfix/main-precondition-mmodel' into 'master'

fix 'segfault' in the generated code when the main has a precondition depending on the memory model

See merge request frama-c/e-acsl!174
parents d4c72e04 3bc56749
No related branches found
No related tags found
No related merge requests found
...@@ -15,6 +15,9 @@ ...@@ -15,6 +15,9 @@
# E-ACSL: the Whole E-ACSL plug-in # E-ACSL: the Whole E-ACSL plug-in
############################################################################### ###############################################################################
-* E-ACSL [2017/11/27] Fix 'segmentation fault' of the generated monitor
whenever the main as a precondition depending on the memory
model.
-* E-ACSL [2017/11/27] Restore behavior of option -e-acsl-valid broken -* E-ACSL [2017/11/27] Restore behavior of option -e-acsl-valid broken
since Phosphorus (included). since Phosphorus (included).
-* E-ACSL [2017/10/25] Fix bug #2303 about unnamed formals in -* E-ACSL [2017/10/25] Fix bug #2303 about unnamed formals in
......
...@@ -4,11 +4,11 @@ ...@@ -4,11 +4,11 @@
#include <string.h> #include <string.h>
/*@ requires \valid(&argc);
@ requires \valid(&argv); */
int main(int argc, char **argv) { int main(int argc, char **argv) {
int i; int i;
/*@ assert \valid(&argc) ; */
/*@ assert \valid(&argv) ; */
/*@ assert \forall int k; 0 <= k && k < argc ==> \valid(argv + k) ; */ /*@ assert \forall int k; 0 <= k && k < argc ==> \valid(argv + k) ; */
/*@ assert \block_length(argv) == (argc+1)*sizeof(char*) ; */ /*@ assert \block_length(argv) == (argc+1)*sizeof(char*) ; */
......
...@@ -7,7 +7,6 @@ int main(void); ...@@ -7,7 +7,6 @@ int main(void);
int __gen_e_acsl_main(void) int __gen_e_acsl_main(void)
{ {
int __retres; int __retres;
__e_acsl_memory_init((int *)0,(char ***)0,(size_t)8);
goto L1; goto L1;
L1: L1:
/*@ assert X ≡ 0; */ /*@ assert X ≡ 0; */
...@@ -38,6 +37,7 @@ int __gen_e_acsl_main(void) ...@@ -38,6 +37,7 @@ int __gen_e_acsl_main(void)
int main(void) int main(void)
{ {
int __retres; int __retres;
__e_acsl_memory_init((int *)0,(char ***)0,(size_t)8);
__retres = __gen_e_acsl_main(); __retres = __gen_e_acsl_main();
__e_acsl_assert(X == 3,(char *)"Postcondition",(char *)"main", __e_acsl_assert(X == 3,(char *)"Postcondition",(char *)"main",
(char *)"X == 3",7); (char *)"X == 3",7);
......
/* Generated by Frama-C */ /* Generated by Frama-C */
#include "stdlib.h" #include "stdlib.h"
#include "string.h" #include "string.h"
int main(int argc, char **argv) /*@ requires \valid(&argc);
requires \valid(&argv); */
int main(int argc, char **argv);
int __gen_e_acsl_main(int argc, char **argv)
{ {
int __retres; int __retres;
int i; int i;
__e_acsl_memory_init(& argc,& argv,(size_t)8);
/*@ assert \valid(&argc); */
{
int __gen_e_acsl_valid;
__gen_e_acsl_valid = __e_acsl_valid((void *)(& argc),sizeof(int),
(void *)(& argc),(void *)0);
__e_acsl_assert(__gen_e_acsl_valid,(char *)"Assertion",(char *)"main",
(char *)"\\valid(&argc)",10);
}
/*@ assert \valid(&argv); */
{
int __gen_e_acsl_valid_2;
__gen_e_acsl_valid_2 = __e_acsl_valid((void *)(& argv),sizeof(char **),
(void *)(& argv),(void *)0);
__e_acsl_assert(__gen_e_acsl_valid_2,(char *)"Assertion",(char *)"main",
(char *)"\\valid(&argv)",11);
}
/*@ assert ∀ int k; 0 ≤ k < argc ⇒ \valid(argv + k); */ /*@ assert ∀ int k; 0 ≤ k < argc ⇒ \valid(argv + k); */
{ {
int __gen_e_acsl_forall; int __gen_e_acsl_forall;
int __gen_e_acsl_k; int __gen_e_acsl_k;
__e_acsl_store_block((void *)(& argv),(size_t)8);
__gen_e_acsl_forall = 1; __gen_e_acsl_forall = 1;
__gen_e_acsl_k = 0; __gen_e_acsl_k = 0;
while (1) { while (1) {
if (__gen_e_acsl_k < argc) ; else break; if (__gen_e_acsl_k < argc) ; else break;
{ {
int __gen_e_acsl_valid_3; int __gen_e_acsl_valid;
__gen_e_acsl_valid_3 = __e_acsl_valid((void *)(argv + __gen_e_acsl_k), __gen_e_acsl_valid = __e_acsl_valid((void *)(argv + __gen_e_acsl_k),
sizeof(char *),(void *)argv, sizeof(char *),(void *)argv,
(void *)(& argv)); (void *)(& argv));
if (__gen_e_acsl_valid_3) ; if (__gen_e_acsl_valid) ;
else { else {
__gen_e_acsl_forall = 0; __gen_e_acsl_forall = 0;
goto e_acsl_end_loop1; goto e_acsl_end_loop1;
...@@ -86,7 +74,7 @@ int main(int argc, char **argv) ...@@ -86,7 +74,7 @@ int main(int argc, char **argv)
sizeof(char *)); sizeof(char *));
if (__gen_e_acsl_initialized) { if (__gen_e_acsl_initialized) {
int __gen_e_acsl_valid_read_2; int __gen_e_acsl_valid_read_2;
int __gen_e_acsl_valid_4; int __gen_e_acsl_valid_2;
__gen_e_acsl_valid_read_2 = __e_acsl_valid_read((void *)(argv + argc), __gen_e_acsl_valid_read_2 = __e_acsl_valid_read((void *)(argv + argc),
sizeof(char *), sizeof(char *),
(void *)argv, (void *)argv,
...@@ -94,11 +82,11 @@ int main(int argc, char **argv) ...@@ -94,11 +82,11 @@ int main(int argc, char **argv)
__e_acsl_assert(__gen_e_acsl_valid_read_2,(char *)"RTE",(char *)"main", __e_acsl_assert(__gen_e_acsl_valid_read_2,(char *)"RTE",(char *)"main",
(char *)"mem_access: \\valid_read(argv + argc)",16); (char *)"mem_access: \\valid_read(argv + argc)",16);
/*@ assert Value: mem_access: \valid_read(argv + argc); */ /*@ assert Value: mem_access: \valid_read(argv + argc); */
__gen_e_acsl_valid_4 = __e_acsl_valid((void *)*(argv + argc), __gen_e_acsl_valid_2 = __e_acsl_valid((void *)*(argv + argc),
sizeof(char), sizeof(char),
(void *)*(argv + argc), (void *)*(argv + argc),
(void *)(argv + argc)); (void *)(argv + argc));
__gen_e_acsl_and = __gen_e_acsl_valid_4; __gen_e_acsl_and = __gen_e_acsl_valid_2;
} }
else __gen_e_acsl_and = 0; else __gen_e_acsl_and = 0;
__e_acsl_assert(! __gen_e_acsl_and,(char *)"Assertion",(char *)"main", __e_acsl_assert(! __gen_e_acsl_and,(char *)"Assertion",(char *)"main",
...@@ -118,7 +106,7 @@ int main(int argc, char **argv) ...@@ -118,7 +106,7 @@ int main(int argc, char **argv)
sizeof(char *)); sizeof(char *));
if (__gen_e_acsl_initialized_2) { if (__gen_e_acsl_initialized_2) {
int __gen_e_acsl_valid_read_3; int __gen_e_acsl_valid_read_3;
int __gen_e_acsl_valid_5; int __gen_e_acsl_valid_3;
__gen_e_acsl_valid_read_3 = __e_acsl_valid_read((void *)(argv + i), __gen_e_acsl_valid_read_3 = __e_acsl_valid_read((void *)(argv + i),
sizeof(char *), sizeof(char *),
(void *)argv, (void *)argv,
...@@ -126,11 +114,11 @@ int main(int argc, char **argv) ...@@ -126,11 +114,11 @@ int main(int argc, char **argv)
__e_acsl_assert(__gen_e_acsl_valid_read_3,(char *)"RTE", __e_acsl_assert(__gen_e_acsl_valid_read_3,(char *)"RTE",
(char *)"main", (char *)"main",
(char *)"mem_access: \\valid_read(argv + i)",19); (char *)"mem_access: \\valid_read(argv + i)",19);
__gen_e_acsl_valid_5 = __e_acsl_valid((void *)*(argv + i), __gen_e_acsl_valid_3 = __e_acsl_valid((void *)*(argv + i),
sizeof(char), sizeof(char),
(void *)*(argv + i), (void *)*(argv + i),
(void *)(argv + i)); (void *)(argv + i));
__gen_e_acsl_and_2 = __gen_e_acsl_valid_5; __gen_e_acsl_and_2 = __gen_e_acsl_valid_3;
} }
else __gen_e_acsl_and_2 = 0; else __gen_e_acsl_and_2 = 0;
__e_acsl_assert(__gen_e_acsl_and_2,(char *)"Assertion", __e_acsl_assert(__gen_e_acsl_and_2,(char *)"Assertion",
...@@ -146,7 +134,7 @@ int main(int argc, char **argv) ...@@ -146,7 +134,7 @@ int main(int argc, char **argv)
if (__gen_e_acsl_k_2 <= len) ; else break; if (__gen_e_acsl_k_2 <= len) ; else break;
{ {
int __gen_e_acsl_valid_read_4; int __gen_e_acsl_valid_read_4;
int __gen_e_acsl_valid_6; int __gen_e_acsl_valid_4;
__gen_e_acsl_valid_read_4 = __e_acsl_valid_read((void *)( __gen_e_acsl_valid_read_4 = __e_acsl_valid_read((void *)(
argv + i), argv + i),
sizeof(char *), sizeof(char *),
...@@ -155,11 +143,11 @@ int main(int argc, char **argv) ...@@ -155,11 +143,11 @@ int main(int argc, char **argv)
__e_acsl_assert(__gen_e_acsl_valid_read_4,(char *)"RTE", __e_acsl_assert(__gen_e_acsl_valid_read_4,(char *)"RTE",
(char *)"main", (char *)"main",
(char *)"mem_access: \\valid_read(argv + i)",20); (char *)"mem_access: \\valid_read(argv + i)",20);
__gen_e_acsl_valid_6 = __e_acsl_valid((void *)(*(argv + i) + __gen_e_acsl_k_2), __gen_e_acsl_valid_4 = __e_acsl_valid((void *)(*(argv + i) + __gen_e_acsl_k_2),
sizeof(char), sizeof(char),
(void *)*(argv + i), (void *)*(argv + i),
(void *)(argv + i)); (void *)(argv + i));
if (__gen_e_acsl_valid_6) ; if (__gen_e_acsl_valid_4) ;
else { else {
__gen_e_acsl_forall_2 = 0; __gen_e_acsl_forall_2 = 0;
goto e_acsl_end_loop2; goto e_acsl_end_loop2;
...@@ -178,7 +166,29 @@ int main(int argc, char **argv) ...@@ -178,7 +166,29 @@ int main(int argc, char **argv)
} }
__retres = 0; __retres = 0;
__e_acsl_delete_block((void *)(& argv)); __e_acsl_delete_block((void *)(& argv));
__e_acsl_delete_block((void *)(& argc)); return __retres;
}
/*@ requires \valid(&argc);
requires \valid(&argv); */
int main(int argc, char **argv)
{
int __retres;
__e_acsl_memory_init(& argc,& argv,(size_t)8);
{
int __gen_e_acsl_valid;
int __gen_e_acsl_valid_2;
__gen_e_acsl_valid = __e_acsl_valid((void *)(& argc),sizeof(int),
(void *)(& argc),(void *)0);
__e_acsl_assert(__gen_e_acsl_valid,(char *)"Precondition",(char *)"main",
(char *)"\\valid(&argc)",7);
__gen_e_acsl_valid_2 = __e_acsl_valid((void *)(& argv),sizeof(char **),
(void *)(& argv),(void *)0);
__e_acsl_assert(__gen_e_acsl_valid_2,(char *)"Precondition",
(char *)"main",(char *)"\\valid(&argv)",8);
}
__retres = __gen_e_acsl_main(argc,argv);
__e_acsl_delete_block((void *)(& argv));
__e_acsl_memory_clean(); __e_acsl_memory_clean();
return __retres; return __retres;
} }
......
...@@ -370,8 +370,9 @@ you must call function `%s' and `__e_acsl_memory_clean by yourself.@]" ...@@ -370,8 +370,9 @@ you must call function `%s' and `__e_acsl_memory_clean by yourself.@]"
vi.vghost <- false; vi.vghost <- false;
Builtins.update vi.vname vi; Builtins.update vi.vname vi;
(* remember that we have to remove the main later (see method (* remember that we have to remove the main later (see method
[vfile]) *) [vfile]); do not use the [vorig_name] since both [main] and
if vi.vorig_name = Kernel.MainFunction.get () then [__e_acsl_main] have the same [vorig_name]. *)
if vi.vname = Kernel.MainFunction.get () then
main_fct <- Some fundec main_fct <- Some fundec
| GVarDecl(vi, _) | GFunDecl(_, vi, _) -> | GVarDecl(vi, _) | GFunDecl(_, vi, _) ->
(* do not convert extern ghost variables, because they can't be linked, (* do not convert extern ghost variables, because they can't be linked,
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment