diff --git a/src/plugins/e-acsl/tests/bts/issue-eacsl-40.c b/src/plugins/e-acsl/tests/bts/issue-eacsl-40.c index c2306b33bd28b649bdd59e27c6ecfc3b8acbf8fc..aa21266b8c8266aee648615e72d6df675a25adc8 100644 --- a/src/plugins/e-acsl/tests/bts/issue-eacsl-40.c +++ b/src/plugins/e-acsl/tests/bts/issue-eacsl-40.c @@ -11,6 +11,7 @@ int main() { if (f) { char buf[4]; int res = fread(buf, 1, 4, f); + fclose(f); if (res == 4) { //@ assert \initialized(&buf[3]); buf[0] = buf[3]; diff --git a/src/plugins/e-acsl/tests/bts/oracle/gen_issue-eacsl-40.c b/src/plugins/e-acsl/tests/bts/oracle/gen_issue-eacsl-40.c index a77ca62bfe58ef77a90b7508ad4f018234be657f..ad1fd155052e5c428dc732b8365cd7a6ce1c43c9 100644 --- a/src/plugins/e-acsl/tests/bts/oracle/gen_issue-eacsl-40.c +++ b/src/plugins/e-acsl/tests/bts/oracle/gen_issue-eacsl-40.c @@ -10,6 +10,13 @@ char *__gen_e_acsl_literal_string; char *__gen_e_acsl_literal_string_2; extern __attribute__((__FC_BUILTIN__)) int __e_acsl_sound_verdict; +/*@ requires valid_stream: \valid(stream); + ensures result_zero_or_EOF: \result == 0 || \result == -1; + assigns \result; + assigns \result \from (indirect: stream), (indirect: *stream); + */ +int __gen_e_acsl_fclose(FILE *stream); + /*@ requires valid_filename: valid_read_string(filename); requires valid_mode: valid_read_string(mode); ensures @@ -408,6 +415,63 @@ FILE *__gen_e_acsl_fopen(char const * restrict filename, return __retres; } +/*@ requires valid_stream: \valid(stream); + ensures result_zero_or_EOF: \result == 0 || \result == -1; + assigns \result; + assigns \result \from (indirect: stream), (indirect: *stream); + */ +int __gen_e_acsl_fclose(FILE *stream) +{ + int __retres; + { + int __gen_e_acsl_valid; + __e_acsl_store_block((void *)(& stream),8UL); + __e_acsl_assert_data_t __gen_e_acsl_assert_data = {.values = (void *)0}; + __gen_e_acsl_valid = __e_acsl_valid((void *)stream,sizeof(FILE), + (void *)stream,(void *)(& stream)); + __e_acsl_assert_register_ptr(& __gen_e_acsl_assert_data,"stream", + (void *)stream); + __e_acsl_assert_register_ulong(& __gen_e_acsl_assert_data,"sizeof(FILE)", + 0,sizeof(FILE)); + __e_acsl_assert_register_int(& __gen_e_acsl_assert_data, + "\\valid(stream)",0,__gen_e_acsl_valid); + __gen_e_acsl_assert_data.blocking = 1; + __gen_e_acsl_assert_data.kind = "Precondition"; + __gen_e_acsl_assert_data.pred_txt = "\\valid(stream)"; + __gen_e_acsl_assert_data.file = "FRAMAC_SHARE/libc/stdio.h"; + __gen_e_acsl_assert_data.fct = "fclose"; + __gen_e_acsl_assert_data.line = 120; + __gen_e_acsl_assert_data.name = "valid_stream"; + __e_acsl_assert(__gen_e_acsl_valid,& __gen_e_acsl_assert_data); + __e_acsl_assert_clean(& __gen_e_acsl_assert_data); + } + __retres = fclose(stream); + { + int __gen_e_acsl_or; + __e_acsl_assert_data_t __gen_e_acsl_assert_data_2 = + {.values = (void *)0}; + __e_acsl_assert_register_int(& __gen_e_acsl_assert_data_2,"\\result",0, + __retres); + if (__retres == 0) __gen_e_acsl_or = 1; + else { + __e_acsl_assert_register_int(& __gen_e_acsl_assert_data_2,"\\result",0, + __retres); + __gen_e_acsl_or = __retres == -1; + } + __gen_e_acsl_assert_data_2.blocking = 1; + __gen_e_acsl_assert_data_2.kind = "Postcondition"; + __gen_e_acsl_assert_data_2.pred_txt = "\\result == 0 || \\result == -1"; + __gen_e_acsl_assert_data_2.file = "FRAMAC_SHARE/libc/stdio.h"; + __gen_e_acsl_assert_data_2.fct = "fclose"; + __gen_e_acsl_assert_data_2.line = 122; + __gen_e_acsl_assert_data_2.name = "result_zero_or_EOF"; + __e_acsl_assert(__gen_e_acsl_or,& __gen_e_acsl_assert_data_2); + __e_acsl_assert_clean(& __gen_e_acsl_assert_data_2); + __e_acsl_delete_block((void *)(& stream)); + return __retres; + } +} + void __e_acsl_globals_init(void) { static char __e_acsl_already_run = 0; @@ -443,6 +507,7 @@ int main(void) __e_acsl_store_block((void *)(buf_0),4UL); tmp_0 = __gen_e_acsl_fread((void *)(buf_0),(size_t)1,(size_t)4,f); int res = (int)tmp_0; + __gen_e_acsl_fclose(f); if (res == 4) { { int __gen_e_acsl_initialized; @@ -462,7 +527,7 @@ int main(void) __gen_e_acsl_assert_data.pred_txt = "\\initialized(&buf_0[3])"; __gen_e_acsl_assert_data.file = "issue-eacsl-40.c"; __gen_e_acsl_assert_data.fct = "main"; - __gen_e_acsl_assert_data.line = 15; + __gen_e_acsl_assert_data.line = 16; __e_acsl_assert(__gen_e_acsl_initialized,& __gen_e_acsl_assert_data); __e_acsl_assert_clean(& __gen_e_acsl_assert_data); } diff --git a/src/plugins/e-acsl/tests/bts/oracle/issue-eacsl-40.res.oracle b/src/plugins/e-acsl/tests/bts/oracle/issue-eacsl-40.res.oracle index 5d7b7b396b9286b8ed229b797471acf27af2d80b..aacd127bce378a5ddba8a647e7037b3eb04e679d 100644 --- a/src/plugins/e-acsl/tests/bts/oracle/issue-eacsl-40.res.oracle +++ b/src/plugins/e-acsl/tests/bts/oracle/issue-eacsl-40.res.oracle @@ -1,4 +1,7 @@ [e-acsl] beginning translation. +[e-acsl] Warning: annotating undefined function `fclose': + the generated program may miss memory instrumentation + if there are memory-related annotations. [e-acsl] Warning: annotating undefined function `fopen': the generated program may miss memory instrumentation if there are memory-related annotations. @@ -19,6 +22,9 @@ `logic functions or predicates with no definition nor reads clause' is not yet supported. Ignoring annotation. +[e-acsl] FRAMAC_SHARE/libc/stdio.h:118: Warning: + E-ACSL construct `assigns clause in behavior' is not yet supported. + Ignoring annotation. [e-acsl] translation done in project "e-acsl". [eva:alarm] FRAMAC_SHARE/libc/stdio.h:351: Warning: function __e_acsl_assert, behavior blocking: precondition got status unknown. @@ -66,12 +72,23 @@ \valid(data->values) got status unknown. [eva:alarm] FRAMAC_SHARE/libc/stdio.h:357: Warning: function __gen_e_acsl_fread: postcondition 'initialization' got status unknown. -[eva:alarm] issue-eacsl-40.c:15: Warning: +[eva:alarm] FRAMAC_SHARE/libc/stdio.h:120: Warning: + function __e_acsl_assert_register_ulong: precondition data->values == \null || + \valid(data->values) got status unknown. +[eva:alarm] FRAMAC_SHARE/libc/stdio.h:120: Warning: + function __e_acsl_assert_register_int: precondition data->values == \null || + \valid(data->values) got status unknown. +[eva:alarm] FRAMAC_SHARE/libc/stdio.h:120: Warning: + function __e_acsl_assert, behavior blocking: precondition got status unknown. +[eva:alarm] FRAMAC_SHARE/libc/stdio.h:122: Warning: + function __e_acsl_assert_register_int: precondition data->values == \null || + \valid(data->values) got status unknown. +[eva:alarm] issue-eacsl-40.c:16: Warning: function __e_acsl_assert_register_ulong: precondition data->values == \null || \valid(data->values) got status unknown. -[eva:alarm] issue-eacsl-40.c:15: Warning: +[eva:alarm] issue-eacsl-40.c:16: Warning: function __e_acsl_assert_register_int: precondition data->values == \null || \valid(data->values) got status unknown. -[eva:alarm] issue-eacsl-40.c:15: Warning: +[eva:alarm] issue-eacsl-40.c:16: Warning: function __e_acsl_assert, behavior blocking: precondition got status unknown. -[eva:alarm] issue-eacsl-40.c:15: Warning: assertion got status unknown. +[eva:alarm] issue-eacsl-40.c:16: Warning: assertion got status unknown.