diff --git a/share/libc/__fc_builtin.h b/share/libc/__fc_builtin.h index ee8719700085117fd7a56bbb58f7455bc0ddbdca..fa8e9c3a759d4c58282e4382453bcf44d4e641ab 100644 --- a/share/libc/__fc_builtin.h +++ b/share/libc/__fc_builtin.h @@ -191,6 +191,12 @@ extern long long Frama_C_abstract_max(long long i); //@ assigns \result \from i; extern long long Frama_C_abstract_min(long long i); +//@ assigns \nothing; +extern void Frama_C_watch_value(void *p, size_t size, int i, int n); + +//@ assigns \nothing; +extern void Frama_C_watch_cardinal(void *p, size_t size, int i, int n); + __END_DECLS __POP_FC_STDLIB diff --git a/src/plugins/aorai/tests/ya/oracle/serial.res.oracle b/src/plugins/aorai/tests/ya/oracle/serial.res.oracle index e97503c8dd4ef4f4851fb7dfccf59722b0dfb501..fc0a491dcf7bcadaa3893e54c598d9e997b3bc53 100644 --- a/src/plugins/aorai/tests/ya/oracle/serial.res.oracle +++ b/src/plugins/aorai/tests/ya/oracle/serial.res.oracle @@ -517,6 +517,12 @@ extern long long Frama_C_abstract_max(long long i); assigns \result \from i; */ extern long long Frama_C_abstract_min(long long i); +/*@ assigns \nothing; */ +extern void Frama_C_watch_value(void *p, size_t size, int i, int n); + +/*@ assigns \nothing; */ +extern void Frama_C_watch_cardinal(void *p, size_t size, int i, int n); + int volatile indefinitely; int buffer[5]; int n = 0; diff --git a/src/plugins/aorai/tests/ya/oracle_prove/serial.res.oracle b/src/plugins/aorai/tests/ya/oracle_prove/serial.res.oracle index 3ee9ca8546d798ee44c5cbfa373696758859ae75..a171b4de92e5e8d97fb60209feb3f84a58c6fe4a 100644 --- a/src/plugins/aorai/tests/ya/oracle_prove/serial.res.oracle +++ b/src/plugins/aorai/tests/ya/oracle_prove/serial.res.oracle @@ -1,5 +1,5 @@ [kernel] Parsing serial.c (with preprocessing) [kernel] Parsing TMPDIR/aorai_serial_0_prove.i (no preprocessing) [wp] Warning: Missing RTE guards -[kernel:annot:missing-spec] TMPDIR/aorai_serial_0_prove.i:1450: Warning: +[kernel:annot:missing-spec] TMPDIR/aorai_serial_0_prove.i:1456: Warning: Neither code nor specification for function Frama_C_show_aorai_state, generating default assigns from the prototype diff --git a/src/plugins/eva/domains/cvalue/builtins_watchpoint.ml b/src/plugins/eva/domains/cvalue/builtins_watchpoint.ml index 0098d74293fd9354d2f6981b24fd7536c5a79fe9..08d4cdb425225371372801b64953cb31a54c6bdf 100644 --- a/src/plugins/eva/domains/cvalue/builtins_watchpoint.ml +++ b/src/plugins/eva/domains/cvalue/builtins_watchpoint.ml @@ -113,8 +113,8 @@ let watch_hook (stmt, _callstack, states) = in if watching then begin - Self.feedback ~once:true ~current:true - "Watchpoint: %a %a%t" + Self.warning ~wkey:Self.wkey_watchpoint ~once:true ~current:true + "%a %a%t" Printer.pp_exp name V.pretty vs Eva_utils.pp_callstack; diff --git a/src/plugins/eva/self.ml b/src/plugins/eva/self.ml index cf109376c8d05157ea5bf5e21d2d9e153e99658e..ac6812870f5aa0d082d510152f469e0ba333e035 100644 --- a/src/plugins/eva/self.ml +++ b/src/plugins/eva/self.ml @@ -133,3 +133,5 @@ let () = set_warn_status wkey_invalid_assigns Log.Wfeedback let wkey_experimental = register_warn_category "experimental" let wkey_unknown_size = register_warn_category "unknown-size" let wkey_ensures_false = register_warn_category "ensures-false" +let wkey_watchpoint = register_warn_category "watchpoint" +let () = set_warn_status wkey_watchpoint Log.Wfeedback diff --git a/src/plugins/eva/self.mli b/src/plugins/eva/self.mli index 97b25ff341643a3f700ffffb5f2fe9a0ab4a8ddb..1616d4bc3f7734b633f0a9f7bdc2e11974ed50fb 100644 --- a/src/plugins/eva/self.mli +++ b/src/plugins/eva/self.mli @@ -78,3 +78,4 @@ val wkey_invalid_assigns : warn_category val wkey_experimental : warn_category val wkey_unknown_size : warn_category val wkey_ensures_false : warn_category +val wkey_watchpoint : warn_category diff --git a/src/plugins/markdown-report/tests/sarif/oracle/std_string.sarif b/src/plugins/markdown-report/tests/sarif/oracle/std_string.sarif index c29b3db8d73bf9099204e617f2593294fb004cb2..226d230c654e28da68998015f8a04d48db53ab90 100644 --- a/src/plugins/markdown-report/tests/sarif/oracle/std_string.sarif +++ b/src/plugins/markdown-report/tests/sarif/oracle/std_string.sarif @@ -4387,6 +4387,106 @@ } ] }, + { + "ruleId": "user-spec", + "kind": "pass", + "level": "none", + "message": { + "text": "behavior default! in function Frama_C_watch_cardinal." + }, + "locations": [ + { + "physicalLocation": { + "artifactLocation": { + "uri": "libc/__fc_builtin.h", + "uriBaseId": "FRAMAC_SHARE" + }, + "region": { + "startLine": 198, + "startColumn": 12, + "endLine": 198, + "endColumn": 34, + "byteLength": 22 + } + } + } + ] + }, + { + "ruleId": "user-spec", + "kind": "pass", + "level": "none", + "message": { + "text": "assigns clause in function Frama_C_watch_cardinal." + }, + "locations": [ + { + "physicalLocation": { + "artifactLocation": { + "uri": "libc/__fc_builtin.h", + "uriBaseId": "FRAMAC_SHARE" + }, + "region": { + "startLine": 198, + "startColumn": 12, + "endLine": 198, + "endColumn": 34, + "byteLength": 22 + } + } + } + ] + }, + { + "ruleId": "user-spec", + "kind": "pass", + "level": "none", + "message": { + "text": "behavior default! in function Frama_C_watch_value." + }, + "locations": [ + { + "physicalLocation": { + "artifactLocation": { + "uri": "libc/__fc_builtin.h", + "uriBaseId": "FRAMAC_SHARE" + }, + "region": { + "startLine": 195, + "startColumn": 12, + "endLine": 195, + "endColumn": 31, + "byteLength": 19 + } + } + } + ] + }, + { + "ruleId": "user-spec", + "kind": "pass", + "level": "none", + "message": { + "text": "assigns clause in function Frama_C_watch_value." + }, + "locations": [ + { + "physicalLocation": { + "artifactLocation": { + "uri": "libc/__fc_builtin.h", + "uriBaseId": "FRAMAC_SHARE" + }, + "region": { + "startLine": 195, + "startColumn": 12, + "endLine": 195, + "endColumn": 31, + "byteLength": 19 + } + } + } + ] + }, { "ruleId": "user-spec", "kind": "pass", diff --git a/tests/builtins/oracle/watch.res.oracle b/tests/builtins/oracle/watch.res.oracle index d0a7fe337f5359bd6bd41e7536d4d1c6d7489935..02a90aa3b1191882577a22f6aa273fdb59c43408 100644 --- a/tests/builtins/oracle/watch.res.oracle +++ b/tests/builtins/oracle/watch.res.oracle @@ -1,10 +1,6 @@ [kernel] Parsing watch.c (with preprocessing) -[kernel:typing:implicit-function-declaration] watch.c:10: Warning: - Calling undeclared function Frama_C_watch_value. Old style K&R code? [kernel:typing:implicit-function-declaration] watch.c:16: Warning: Calling undeclared function u. Old style K&R code? -[kernel:annot:missing-spec] watch.c:8: Warning: - Neither code nor specification for function Frama_C_watch_value, generating default assigns from the prototype [eva] Analyzing a complete application starting at main [eva] Computing initial state [eva] Initial state computed @@ -13,16 +9,16 @@ y ∈ {0} z ∈ {0} [eva] watch.c:10: Call to builtin Frama_C_watch_value -[eva] watch.c:13: Watchpoint: & c [--..--] -[eva] watch.c:14: Watchpoint: & c [--..--] +[eva:watchpoint] watch.c:13: (void *)(& c) [--..--] +[eva:watchpoint] watch.c:14: (void *)(& c) [--..--] [kernel:annot:missing-spec] watch.c:16: Warning: Neither code nor specification for function u, generating default assigns from the prototype [eva] computing for function u <- main. Called from watch.c:16. [eva] using specification for function u [eva] Done for function u -[eva] watch.c:17: Watchpoint: & c [--..--] -[eva] watch.c:18: Watchpoint: & c [--..--] -[eva] watch.c:19: Watchpoint: & c [--..--] +[eva:watchpoint] watch.c:17: (void *)(& c) [--..--] +[eva:watchpoint] watch.c:18: (void *)(& c) [--..--] +[eva:watchpoint] watch.c:19: (void *)(& c) [--..--] [eva] User Error: Watchpoint builtin: countdown to zero [kernel] Plug-in eva aborted: invalid user input. diff --git a/tests/builtins/watch.c b/tests/builtins/watch.c index 80551c782227b4a090236e58b1af57092dc93739..2508646370f5e013419fac5076f5a89d9871c655 100644 --- a/tests/builtins/watch.c +++ b/tests/builtins/watch.c @@ -2,7 +2,7 @@ EXIT: 1 STDOPT: */ - +#include "__fc_builtin.h" int x,y,z; int main(int c){ diff --git a/tests/libc/oracle/fc_libc.1.res.oracle b/tests/libc/oracle/fc_libc.1.res.oracle index 740ca94c2c576e8051f3a7454075ab85eb96ec5b..8ce7b3829c60d4afb7a416be103cf3f7f2894c5f 100644 --- a/tests/libc/oracle/fc_libc.1.res.oracle +++ b/tests/libc/oracle/fc_libc.1.res.oracle @@ -512,6 +512,12 @@ extern long long Frama_C_abstract_max(long long i); assigns \result \from i; */ extern long long Frama_C_abstract_min(long long i); +/*@ assigns \nothing; */ +extern void Frama_C_watch_value(void *p, size_t size, int i, int n); + +/*@ assigns \nothing; */ +extern void Frama_C_watch_cardinal(void *p, size_t size, int i, int n); + unsigned int volatile __fc_unsigned_int_entropy; long volatile __fc_long_entropy; unsigned long volatile __fc_unsigned_long_entropy; diff --git a/tests/misc/oracle/audit-out.json b/tests/misc/oracle/audit-out.json index a30dab6035590e9ad28c191c7141cfbb4dda5a71..8d1c3de1c501006d251af2aea1021d8751c5d3eb 100644 --- a/tests/misc/oracle/audit-out.json +++ b/tests/misc/oracle/audit-out.json @@ -45,7 +45,7 @@ "disabled": [ "garbled-mix", "invalid-assigns", "loop-unroll:auto", "loop-unroll:missing", "loop-unroll:missing:for", - "loop-unroll:partial", "malloc:weak" + "loop-unroll:partial", "malloc:weak", "watchpoint" ] } },