Incorrect Evaluation of the \at Predicate with the Init Label in the E-ACSL Plugin
### Steps to reproduce the issue
1. Instrument and compile the input file at_label_Init.c using the command: e-acsl-gcc.sh -c at_label_Init.c
2. Execute the generated file: ./a.out.e-acsl
The content of at_label_Init.c is as follows:
```C
int global_var = 0;
/*@ ensures \result == \at(global_var, Init); */ // Test 3: Should pass
int get_init_state() {
return 0;
}
/*@
ensures \at(global_var, Init) == 0; // Test 1: Should pass
ensures global_var == 10;
*/
void test_init_label() {
global_var = 10;
}
int main() {
/*@ assert \at(global_var, Init) == 0; */
test_init_label();
/*@ assert \at(global_var, Init) == 0; */ // Test 2: Should pass
int init_val = get_init_state();
/*@ assert init_val == 0; */
return 0;
}
```
### Expected behaviour
The execution of ./a.out.e-acsl should terminate normally without any output. All ACSL annotations should be satisfied, as the Init label is permitted in all annotations and, according to the manual frama-c-acsl-implementation.pdf, refers to the program state before the call to main.
### Actual behaviour
When individually testing all three annotations marked with Test X (where X = 1, 2, 3), the execution of ./a.out.e-acsl reports errors and terminates with "Aborted (core dumped)":
- For Test 1 and 3: Error: Postcondition failed
- For Test 2: Error: Assertion failed. The E-ACSL plugin incorrectly evaluates all three annotations as unsatisfied.
### Contextual information
- Frama-C installation mode: Opam
- Frama-C version: 31.0 (Gallium)
- Plug-in used: E-ACSL
- OS name: WSL 2
- OS version: Windows 11, Ubuntu 24.04
Reported on behalf of Wenjian Chai (chaiwj@ios.ac.cn)
issue