From 529093555a14d2031e4ca16a5b601da7dd88edc0 Mon Sep 17 00:00:00 2001 From: Thibault Martin <thi.martin.pro@pm.me> Date: Tue, 1 Aug 2023 11:49:54 +0200 Subject: [PATCH] Add tests and oracles for Populate_spec --- tests/spec/default_spec_combine.i | 67 +++++++++++++ tests/spec/default_spec_combine.ml | 28 ++++++ tests/spec/default_spec_custom.i | 20 ++++ tests/spec/default_spec_custom.ml | 42 ++++++++ tests/spec/default_spec_mode.i | 32 ++++++ .../oracle/default_spec_combine.0.res.oracle | 83 ++++++++++++++++ .../oracle/default_spec_combine.1.res.oracle | 90 +++++++++++++++++ .../oracle/default_spec_combine.2.res.oracle | 99 +++++++++++++++++++ .../oracle/default_spec_custom.0.res.oracle | 48 +++++++++ .../oracle/default_spec_custom.1.res.oracle | 39 ++++++++ .../oracle/default_spec_custom.2.res.oracle | 5 + .../oracle/default_spec_mode.0.res.oracle | 22 +++++ .../oracle/default_spec_mode.1.res.oracle | 22 +++++ .../oracle/default_spec_mode.2.res.oracle | 30 ++++++ .../oracle/default_spec_mode.3.res.oracle | 34 +++++++ .../oracle/default_spec_mode.4.res.oracle | 40 ++++++++ .../oracle/default_spec_mode.5.res.oracle | 35 +++++++ .../oracle/default_spec_mode.6.res.oracle | 4 + .../oracle/default_spec_mode.7.res.oracle | 4 + 19 files changed, 744 insertions(+) create mode 100644 tests/spec/default_spec_combine.i create mode 100644 tests/spec/default_spec_combine.ml create mode 100644 tests/spec/default_spec_custom.i create mode 100644 tests/spec/default_spec_custom.ml create mode 100644 tests/spec/default_spec_mode.i create mode 100644 tests/spec/oracle/default_spec_combine.0.res.oracle create mode 100644 tests/spec/oracle/default_spec_combine.1.res.oracle create mode 100644 tests/spec/oracle/default_spec_combine.2.res.oracle create mode 100644 tests/spec/oracle/default_spec_custom.0.res.oracle create mode 100644 tests/spec/oracle/default_spec_custom.1.res.oracle create mode 100644 tests/spec/oracle/default_spec_custom.2.res.oracle create mode 100644 tests/spec/oracle/default_spec_mode.0.res.oracle create mode 100644 tests/spec/oracle/default_spec_mode.1.res.oracle create mode 100644 tests/spec/oracle/default_spec_mode.2.res.oracle create mode 100644 tests/spec/oracle/default_spec_mode.3.res.oracle create mode 100644 tests/spec/oracle/default_spec_mode.4.res.oracle create mode 100644 tests/spec/oracle/default_spec_mode.5.res.oracle create mode 100644 tests/spec/oracle/default_spec_mode.6.res.oracle create mode 100644 tests/spec/oracle/default_spec_mode.7.res.oracle diff --git a/tests/spec/default_spec_combine.i b/tests/spec/default_spec_combine.i new file mode 100644 index 00000000000..7910730ee26 --- /dev/null +++ b/tests/spec/default_spec_combine.i @@ -0,0 +1,67 @@ +/* run.config + + MODULE: @PTEST_NAME@ + STDOPT: +"-generated-spec-mode donothing" + STDOPT: +"-generated-spec-mode safe" + STDOPT: +"-generated-spec-mode frama-c" +*/ + +/*@ axiomatic a { + @ predicate P reads \nothing; + @ predicate Q reads \nothing; + @ predicate R reads \nothing; + }*/ + + +// Test combine exits +/*@ behavior A: + @ exits P; + @ behavior B: + @ exits Q; + @ exits R; + @ complete behaviors; + @*/ +void f1(void); + +// Test combine assigns +/*@ behavior A: + @ assigns *a; + @ behavior B: + @ assigns *b; + @ assigns *a \from c; + @ assigns *a \from d; + @ assigns *b \from c; + @ behavior C: + @ assigns *a, *b; + @ complete behaviors; + @*/ +void f2(int* a, int *b, int c, int d); + +// Test combine requires +/*@ behavior A: + @ requires P; + @ requires Q; + @ behavior B: + @ requires P; + @ requires R; + @ requires R; + @ complete behaviors; + @*/ +void f3(void); + +// Test combine frees/allocates +/*@ behavior A: + @ allocates \result; + @ allocates \old(a); + @ frees b; + @ behavior B: + @ allocates \result; + @ allocates \old(a); + @ allocates \old(b); + @ frees \nothing; + @ behavior C: + @ allocates \nothing; + @ frees a, b; + @ complete behaviors; + @*/ +int* f4(int* a, int* b); diff --git a/tests/spec/default_spec_combine.ml b/tests/spec/default_spec_combine.ml new file mode 100644 index 00000000000..dd81d458061 --- /dev/null +++ b/tests/spec/default_spec_combine.ml @@ -0,0 +1,28 @@ +open Cil_types + +let gen_exits _ _ = [ ] +let status_exits = Property_status.Dont_know + +let gen_assigns _ _ = WritesAny +let status_assigns = Property_status.Dont_know + +let gen_requires _ _ = [ ] + +let gen_allocates _ _ = FreeAllocAny +let status_allocates = Property_status.Dont_know + +let gen_terminates _ _ = None +let status_terminates = Property_status.Dont_know + +let populate () = + Format.printf "Registering an mode that does nothing@."; + Populate_spec.register + ~gen_exits ~status_exits + ~gen_assigns ~status_assigns + ~gen_requires + ~gen_allocates ~status_allocates + ~gen_terminates ~status_terminates + "donothing" + + + let () = Cmdline.run_after_configuring_stage populate diff --git a/tests/spec/default_spec_custom.i b/tests/spec/default_spec_custom.i new file mode 100644 index 00000000000..e7ccb0aff38 --- /dev/null +++ b/tests/spec/default_spec_custom.i @@ -0,0 +1,20 @@ +/* run.config + MODULE: @PTEST_NAME@ + STDOPT: +"-generated-spec-mode emptymode" + STDOPT: +"-generated-spec-mode mymode" + EXIT: 1 + STDOPT: +"-generated-spec-mode notregisteredmode" +*/ + +void f1(void); + +void f2(){ + f1(); + return; +} + +int f3(int* a); + +int f4(int* b){ + return f3(b); +} diff --git a/tests/spec/default_spec_custom.ml b/tests/spec/default_spec_custom.ml new file mode 100644 index 00000000000..5220b814145 --- /dev/null +++ b/tests/spec/default_spec_custom.ml @@ -0,0 +1,42 @@ +open Cil_types + +let gen_exits _ _ = + [ Exits, Logic_const.(new_predicate pfalse) ] + + +let gen_assigns kf _ = + if Kernel_function.has_definition kf then + WritesAny + else Writes (Infer_annotations.assigns_from_prototype kf) + +let gen_requires _ _ = [ Logic_const.(new_predicate pfalse) ] + +let gen_allocates kf _ = + if Kernel_function.has_definition kf + then FreeAlloc([],[]) + else FreeAllocAny + +let gen_terminates kf _ = + if Kernel_function.has_definition kf then + None + else Some(Logic_const.(new_predicate pfalse)) + +let status_exits = Property_status.Dont_know +let status_assigns = Property_status.True +let status_allocates = Property_status.Dont_know +let status_terminates = Property_status.Dont_know + +let populate () = + Format.printf "Registering an empty spec generation mode@."; + Populate_spec.register "emptymode"; + Format.printf "Registering a new spec generation mode@."; + Populate_spec.register + ~gen_exits ~status_exits + ~gen_assigns ~status_assigns + ~gen_requires + ~gen_allocates ~status_allocates + ~gen_terminates ~status_terminates + "mymode" + + + let () = Cmdline.run_after_configuring_stage populate diff --git a/tests/spec/default_spec_mode.i b/tests/spec/default_spec_mode.i new file mode 100644 index 00000000000..5ddda215b76 --- /dev/null +++ b/tests/spec/default_spec_mode.i @@ -0,0 +1,32 @@ +/* run.config + STDOPT: +"-no-generate-default-spec" + STDOPT: +"-generated-spec-mode skip" + STDOPT: +"-generated-spec-mode acsl" + STDOPT: +"-generated-spec-mode safe" + STDOPT: +"-generated-spec-mode frama-c" + STDOPT: +"-generated-spec-custom exits:acsl,assigns:frama-c,requires:safe,allocates:safe,terminates:acsl" + + EXIT: 1 + STDOPT: +"-generated-spec-custom wrong_clause:safe" + STDOPT: +"-generated-spec-custom wrong_clause:" +*/ + +// empty spec prototype +void f1(void); + +// empty spec function +void f2(){ + f1(); + return; +} + +// Test for automatic assigns +int f3(int* a); + +// Has behavior by default +/*@ requires \true; + @ assigns *b; +*/ +int f4(int* b){ + return f3(b); +} diff --git a/tests/spec/oracle/default_spec_combine.0.res.oracle b/tests/spec/oracle/default_spec_combine.0.res.oracle new file mode 100644 index 00000000000..35690113209 --- /dev/null +++ b/tests/spec/oracle/default_spec_combine.0.res.oracle @@ -0,0 +1,83 @@ +Registering an mode that does nothing +[kernel] Parsing default_spec_combine.i (no preprocessing) +/* Generated by Frama-C */ +/*@ +axiomatic a { + predicate P + reads \nothing; + + predicate Q + reads \nothing; + + predicate R + reads \nothing; + + } + */ +/*@ exits P ∨ Q ∨ R; + + behavior A: + exits P; + + behavior B: + exits Q; + exits R; + + complete behaviors B, A; + */ +void f1(void); + +/*@ assigns *a, *b; + assigns *a \from c; + assigns *a \from d; + assigns *b \from c; + + behavior A: + assigns *a; + + behavior B: + assigns *b, *a; + assigns *b \from c; + assigns *a \from c; + assigns *a \from d; + + behavior C: + assigns *a, *b; + + complete behaviors C, B, A; + */ +void f2(int *a, int *b, int c, int d); + +/*@ requires (P ∧ Q) ∨ (P ∧ R); + + behavior A: + requires P; + requires Q; + + behavior B: + requires P; + requires R; + requires R; + + complete behaviors B, A; + */ +void f3(void); + +/*@ frees a, b; + allocates \result, \old(a), \old(b); + + behavior A: + frees b; + allocates \result, \old(a); + + behavior B: + allocates \result, \old(a), \old(b); + + behavior C: + frees a, b; + + complete behaviors C, B, A; + */ +int *f4(int *a, int *b); + + diff --git a/tests/spec/oracle/default_spec_combine.1.res.oracle b/tests/spec/oracle/default_spec_combine.1.res.oracle new file mode 100644 index 00000000000..0a1534d061e --- /dev/null +++ b/tests/spec/oracle/default_spec_combine.1.res.oracle @@ -0,0 +1,90 @@ +Registering an mode that does nothing +[kernel] Parsing default_spec_combine.i (no preprocessing) +/* Generated by Frama-C */ +/*@ +axiomatic a { + predicate P + reads \nothing; + + predicate Q + reads \nothing; + + predicate R + reads \nothing; + + } + */ +/*@ requires \false; + terminates \false; + exits P ∨ Q ∨ R; + + behavior A: + exits P; + + behavior B: + exits Q; + exits R; + + complete behaviors B, A; + */ +void f1(void); + +/*@ requires \false; + terminates \false; + assigns *a, *b; + assigns *a \from c; + assigns *a \from d; + assigns *b \from c; + + behavior A: + assigns *a; + + behavior B: + assigns *b, *a; + assigns *b \from c; + assigns *a \from c; + assigns *a \from d; + + behavior C: + assigns *a, *b; + + complete behaviors C, B, A; + */ +void f2(int *a, int *b, int c, int d); + +/*@ requires (P ∧ Q) ∨ (P ∧ R); + terminates \false; + + behavior A: + requires P; + requires Q; + + behavior B: + requires P; + requires R; + requires R; + + complete behaviors B, A; + */ +void f3(void); + +/*@ requires \false; + terminates \false; + frees a, b; + allocates \result, \old(a), \old(b); + + behavior A: + frees b; + allocates \result, \old(a); + + behavior B: + allocates \result, \old(a), \old(b); + + behavior C: + frees a, b; + + complete behaviors C, B, A; + */ +int *f4(int *a, int *b); + + diff --git a/tests/spec/oracle/default_spec_combine.2.res.oracle b/tests/spec/oracle/default_spec_combine.2.res.oracle new file mode 100644 index 00000000000..9d91be61fde --- /dev/null +++ b/tests/spec/oracle/default_spec_combine.2.res.oracle @@ -0,0 +1,99 @@ +Registering an mode that does nothing +[kernel] Parsing default_spec_combine.i (no preprocessing) +/* Generated by Frama-C */ +/*@ +axiomatic a { + predicate P + reads \nothing; + + predicate Q + reads \nothing; + + predicate R + reads \nothing; + + } + */ +/*@ terminates \true; + exits P ∨ Q ∨ R; + assigns \nothing; + allocates \nothing; + + behavior A: + exits P; + + behavior B: + exits Q; + exits R; + + complete behaviors B, A; + */ +void f1(void); + +/*@ terminates \true; + exits \false; + assigns *a, *b; + assigns *a \from c; + assigns *a \from d; + assigns *b \from c; + allocates \nothing; + + behavior A: + assigns *a; + + behavior B: + assigns *b, *a; + assigns *b \from c; + assigns *a \from c; + assigns *a \from d; + + behavior C: + assigns *a, *b; + + complete behaviors C, B, A; + */ +void f2(int *a, int *b, int c, int d); + +/*@ requires (P ∧ Q) ∨ (P ∧ R); + terminates \true; + exits \false; + assigns \nothing; + allocates \nothing; + + behavior A: + requires P; + requires Q; + + behavior B: + requires P; + requires R; + requires R; + + complete behaviors B, A; + */ +void f3(void); + +/*@ terminates \true; + exits \false; + assigns \result, *a, *b; + assigns \result \from *a, *b; + assigns *a \from *a, *b; + assigns *b \from *a, *b; + frees a, b; + allocates \result, \old(a), \old(b); + + behavior A: + frees b; + allocates \result, \old(a); + + behavior B: + allocates \result, \old(a), \old(b); + + behavior C: + frees a, b; + + complete behaviors C, B, A; + */ +int *f4(int *a, int *b); + + diff --git a/tests/spec/oracle/default_spec_custom.0.res.oracle b/tests/spec/oracle/default_spec_custom.0.res.oracle new file mode 100644 index 00000000000..72faead364b --- /dev/null +++ b/tests/spec/oracle/default_spec_custom.0.res.oracle @@ -0,0 +1,48 @@ +Registering an empty spec generation mode +Registering a new spec generation mode +[kernel] Parsing default_spec_custom.i (no preprocessing) +[kernel] Warning: Custom generation from mode emptymode not defined for exits, using frama-c mode instead +[kernel] Warning: Custom generation from mode emptymode not defined for assigns, using frama-c mode instead +[kernel] Warning: Custom generation from mode emptymode not defined for requires, using frama-c mode instead +[kernel] Warning: Custom generation from mode emptymode not defined for allocates, using frama-c mode instead +[kernel] Warning: Custom generation from mode emptymode not defined for terminates, using frama-c mode instead +[kernel] Warning: Custom status from mode emptymode not defined for exits +[kernel] Warning: Custom status from mode emptymode not defined for assigns +[kernel] Warning: Custom status from mode emptymode not defined for allocates +[kernel] Warning: Custom status from mode emptymode not defined for terminates +/* Generated by Frama-C */ +/*@ terminates \true; + exits \false; + assigns \nothing; + allocates \nothing; */ +void f1(void); + +/*@ terminates \true; + exits \false; + allocates \nothing; */ +void f2(void) +{ + f1(); + return; +} + +/*@ terminates \true; + exits \false; + assigns \result, *a; + assigns \result \from *a; + assigns *a \from *a; + allocates \nothing; + */ +int f3(int *a); + +/*@ terminates \true; + exits \false; + allocates \nothing; */ +int f4(int *b) +{ + int tmp; + tmp = f3(b); + return tmp; +} + + diff --git a/tests/spec/oracle/default_spec_custom.1.res.oracle b/tests/spec/oracle/default_spec_custom.1.res.oracle new file mode 100644 index 00000000000..7c6188e9550 --- /dev/null +++ b/tests/spec/oracle/default_spec_custom.1.res.oracle @@ -0,0 +1,39 @@ +Registering an empty spec generation mode +Registering a new spec generation mode +[kernel] Parsing default_spec_custom.i (no preprocessing) +/* Generated by Frama-C */ +/*@ requires \false; + terminates \false; + exits \false; + assigns \nothing; */ +void f1(void); + +/*@ requires \false; + exits \false; + allocates \nothing; */ +void f2(void) +{ + f1(); + return; +} + +/*@ requires \false; + terminates \false; + exits \false; + assigns \result, *a; + assigns \result \from *a; + assigns *a \from *a; + */ +int f3(int *a); + +/*@ requires \false; + exits \false; + allocates \nothing; */ +int f4(int *b) +{ + int tmp; + tmp = f3(b); + return tmp; +} + + diff --git a/tests/spec/oracle/default_spec_custom.2.res.oracle b/tests/spec/oracle/default_spec_custom.2.res.oracle new file mode 100644 index 00000000000..8838712c46e --- /dev/null +++ b/tests/spec/oracle/default_spec_custom.2.res.oracle @@ -0,0 +1,5 @@ +Registering an empty spec generation mode +Registering a new spec generation mode +[kernel] Parsing default_spec_custom.i (no preprocessing) +[kernel] User Error: Mode notregisteredmode is not registered +[kernel] Frama-C aborted: invalid user input. diff --git a/tests/spec/oracle/default_spec_mode.0.res.oracle b/tests/spec/oracle/default_spec_mode.0.res.oracle new file mode 100644 index 00000000000..9624686acc4 --- /dev/null +++ b/tests/spec/oracle/default_spec_mode.0.res.oracle @@ -0,0 +1,22 @@ +[kernel] Parsing default_spec_mode.i (no preprocessing) +/* Generated by Frama-C */ +void f1(void); + +void f2(void) +{ + f1(); + return; +} + +int f3(int *a); + +/*@ requires \true; + assigns *b; */ +int f4(int *b) +{ + int tmp; + tmp = f3(b); + return tmp; +} + + diff --git a/tests/spec/oracle/default_spec_mode.1.res.oracle b/tests/spec/oracle/default_spec_mode.1.res.oracle new file mode 100644 index 00000000000..9624686acc4 --- /dev/null +++ b/tests/spec/oracle/default_spec_mode.1.res.oracle @@ -0,0 +1,22 @@ +[kernel] Parsing default_spec_mode.i (no preprocessing) +/* Generated by Frama-C */ +void f1(void); + +void f2(void) +{ + f1(); + return; +} + +int f3(int *a); + +/*@ requires \true; + assigns *b; */ +int f4(int *b) +{ + int tmp; + tmp = f3(b); + return tmp; +} + + diff --git a/tests/spec/oracle/default_spec_mode.2.res.oracle b/tests/spec/oracle/default_spec_mode.2.res.oracle new file mode 100644 index 00000000000..ecda6945556 --- /dev/null +++ b/tests/spec/oracle/default_spec_mode.2.res.oracle @@ -0,0 +1,30 @@ +[kernel] Parsing default_spec_mode.i (no preprocessing) +/* Generated by Frama-C */ +/*@ terminates \true; + allocates \nothing; */ +void f1(void); + +/*@ terminates \true; + allocates \nothing; */ +void f2(void) +{ + f1(); + return; +} + +/*@ terminates \true; + allocates \nothing; */ +int f3(int *a); + +/*@ requires \true; + terminates \true; + assigns *b; + allocates \nothing; */ +int f4(int *b) +{ + int tmp; + tmp = f3(b); + return tmp; +} + + diff --git a/tests/spec/oracle/default_spec_mode.3.res.oracle b/tests/spec/oracle/default_spec_mode.3.res.oracle new file mode 100644 index 00000000000..9ae4d897289 --- /dev/null +++ b/tests/spec/oracle/default_spec_mode.3.res.oracle @@ -0,0 +1,34 @@ +[kernel] Parsing default_spec_mode.i (no preprocessing) +/* Generated by Frama-C */ +/*@ requires \false; + terminates \false; */ +void f1(void); + +/*@ terminates \true; + exits \false; + assigns \nothing; + allocates \nothing; */ +void f2(void) +{ + f1(); + return; +} + +/*@ requires \false; + terminates \false; */ +int f3(int *a); + +/*@ requires \true; + terminates \true; + exits \false; + assigns *b; + allocates \nothing; + */ +int f4(int *b) +{ + int tmp; + tmp = f3(b); + return tmp; +} + + diff --git a/tests/spec/oracle/default_spec_mode.4.res.oracle b/tests/spec/oracle/default_spec_mode.4.res.oracle new file mode 100644 index 00000000000..272ef95df50 --- /dev/null +++ b/tests/spec/oracle/default_spec_mode.4.res.oracle @@ -0,0 +1,40 @@ +[kernel] Parsing default_spec_mode.i (no preprocessing) +/* Generated by Frama-C */ +/*@ terminates \true; + exits \false; + assigns \nothing; + allocates \nothing; */ +void f1(void); + +/*@ terminates \true; + exits \false; + allocates \nothing; */ +void f2(void) +{ + f1(); + return; +} + +/*@ terminates \true; + exits \false; + assigns \result, *a; + assigns \result \from *a; + assigns *a \from *a; + allocates \nothing; + */ +int f3(int *a); + +/*@ requires \true; + terminates \true; + exits \false; + assigns *b; + allocates \nothing; + */ +int f4(int *b) +{ + int tmp; + tmp = f3(b); + return tmp; +} + + diff --git a/tests/spec/oracle/default_spec_mode.5.res.oracle b/tests/spec/oracle/default_spec_mode.5.res.oracle new file mode 100644 index 00000000000..1fa027e6baf --- /dev/null +++ b/tests/spec/oracle/default_spec_mode.5.res.oracle @@ -0,0 +1,35 @@ +[kernel] Parsing default_spec_mode.i (no preprocessing) +/* Generated by Frama-C */ +/*@ requires \false; + terminates \true; + assigns \nothing; */ +void f1(void); + +/*@ terminates \true; + allocates \nothing; */ +void f2(void) +{ + f1(); + return; +} + +/*@ requires \false; + terminates \true; + assigns \result, *a; + assigns \result \from *a; + assigns *a \from *a; + */ +int f3(int *a); + +/*@ requires \true; + terminates \true; + assigns *b; + allocates \nothing; */ +int f4(int *b) +{ + int tmp; + tmp = f3(b); + return tmp; +} + + diff --git a/tests/spec/oracle/default_spec_mode.6.res.oracle b/tests/spec/oracle/default_spec_mode.6.res.oracle new file mode 100644 index 00000000000..0431517a924 --- /dev/null +++ b/tests/spec/oracle/default_spec_mode.6.res.oracle @@ -0,0 +1,4 @@ +[kernel] Parsing default_spec_mode.i (no preprocessing) +[kernel] User Error: 'wrong_clause' is not a valid key for -generated-spec-custom. + Accepted keys are 'exits', 'assigns', 'requires', 'allocates' and 'terminates'. +[kernel] Frama-C aborted: invalid user input. diff --git a/tests/spec/oracle/default_spec_mode.7.res.oracle b/tests/spec/oracle/default_spec_mode.7.res.oracle new file mode 100644 index 00000000000..0431517a924 --- /dev/null +++ b/tests/spec/oracle/default_spec_mode.7.res.oracle @@ -0,0 +1,4 @@ +[kernel] Parsing default_spec_mode.i (no preprocessing) +[kernel] User Error: 'wrong_clause' is not a valid key for -generated-spec-custom. + Accepted keys are 'exits', 'assigns', 'requires', 'allocates' and 'terminates'. +[kernel] Frama-C aborted: invalid user input. -- GitLab