From 4f16554b58dd3b838e31bbab75bd081af9996d78 Mon Sep 17 00:00:00 2001
From: Thibault Martin <thi.martin.pro@pm.me>
Date: Tue, 20 Feb 2024 18:05:04 +0100
Subject: [PATCH] Refuse/Do not print new syntax for kernel extensions

---
 src/kernel_internals/parsing/logic_lexer.mll        |  8 ++++++--
 src/kernel_services/ast_queries/acsl_extension.ml   |  9 +++++++--
 .../aorai/tests/ya/oracle/function_ptr.res.oracle   |  4 ++--
 tests/spec/Extend_kernel.i                          | 13 +++++++++++++
 tests/spec/oracle/Extend_conflict.res.oracle        |  2 +-
 tests/spec/oracle/Extend_kernel.res.oracle          |  4 ++++
 tests/spec/oracle/Extend_warning.res.oracle         |  2 +-
 7 files changed, 34 insertions(+), 8 deletions(-)
 create mode 100644 tests/spec/Extend_kernel.i
 create mode 100644 tests/spec/oracle/Extend_kernel.res.oracle

diff --git a/src/kernel_internals/parsing/logic_lexer.mll b/src/kernel_internals/parsing/logic_lexer.mll
index 1940518ffe3..bf66ceccfda 100644
--- a/src/kernel_internals/parsing/logic_lexer.mll
+++ b/src/kernel_internals/parsing/logic_lexer.mll
@@ -318,7 +318,7 @@
     | IDENTIFIER s ->
       if Plugin.is_present plugin then
         Kernel.warning ~once:true ~wkey:Kernel.wkey_extension_unknown ~source
-          "Unregistered extension %s for plug-in %s" s plugin
+          "Unregistered extension '%s' for plug-in %s" s plugin
       else
         Kernel.warning ~once:true ~wkey:Kernel.wkey_plugin_not_loaded ~source
           "Ignored extensions for unloaded plug-in %s" plugin;
@@ -328,9 +328,13 @@
     | EXT_GLOBAL_BLOCK s
     | EXT_CONTRACT s ->
       let plugin_from = Logic_env.extension_from s in
+      if plugin_from = plugin && plugin = "kernel" then
+        Kernel.abort ~source
+          "Extension '%s' from frama-c's kernel should not be used with the syntax \
+          \\kernel::%s" s s;
       if plugin_from <> plugin then
         Kernel.abort ~source
-          "Extension %s is from %s and not %s" s plugin_from plugin;
+          "Extension '%s' is from %s and not %s" s plugin_from plugin;
       tok
     | _ ->
       Kernel.abort ~source
diff --git a/src/kernel_services/ast_queries/acsl_extension.ml b/src/kernel_services/ast_queries/acsl_extension.ml
index b22e748f786..e50accda366 100644
--- a/src/kernel_services/ast_queries/acsl_extension.ml
+++ b/src/kernel_services/ast_queries/acsl_extension.ml
@@ -191,12 +191,17 @@ module Extensions = struct
   let print name printer fmt kind =
     let ext_common = find_common name in
     let plugin = ext_common.plugin in
+    let full_name =
+      if Datatype.String.equal plugin "kernel" then name
+      else
+        Format.sprintf "\\%s::%s" plugin name
+    in
     let pp = ext_common.printer printer in
     match kind with
     | Ext_annot (id,_) ->
-      Format.fprintf fmt "@[<v 2>@[\\%s::%s %s {@]@\n%a}@]" plugin name id pp kind
+      Format.fprintf fmt "@[<v 2>@[%s %s {@]@\n%a}@]" full_name id pp kind
     | _ ->
-      Format.fprintf fmt "@[<hov 2>\\%s::%s %a;@]" plugin name pp kind
+      Format.fprintf fmt "@[<hov 2>%s %a;@]" full_name pp kind
 
   let short_print name printer fmt kind =
     let pp = (find_common name).short_printer in
diff --git a/src/plugins/aorai/tests/ya/oracle/function_ptr.res.oracle b/src/plugins/aorai/tests/ya/oracle/function_ptr.res.oracle
index 28c7599a5a8..f0391a4fd07 100644
--- a/src/plugins/aorai/tests/ya/oracle/function_ptr.res.oracle
+++ b/src/plugins/aorai/tests/ya/oracle/function_ptr.res.oracle
@@ -508,10 +508,10 @@ int main(int c)
   int __retres;
   /*@ ghost main_pre_func(c); */
   if (c) pf = & f; else pf = & g;
-  /*@ \kernel::calls f, g; */
+  /*@ calls f, g; */
   (*pf)();
   if (c) pf = & g; else pf = & f;
-  /*@ \kernel::calls f, g; */
+  /*@ calls f, g; */
   (*pf)();
   __retres = 0;
   /*@ ghost main_post_func(__retres); */
diff --git a/tests/spec/Extend_kernel.i b/tests/spec/Extend_kernel.i
new file mode 100644
index 00000000000..a53a4fe67fd
--- /dev/null
+++ b/tests/spec/Extend_kernel.i
@@ -0,0 +1,13 @@
+/* run.config
+  EXIT: 1
+  STDOPT:
+*/
+
+int g(int x){
+  return x + 42;
+}
+
+int f(int x) {
+  //@ \kernel::calls g;
+  return g(x);
+}
diff --git a/tests/spec/oracle/Extend_conflict.res.oracle b/tests/spec/oracle/Extend_conflict.res.oracle
index f483db984ec..ae562310f5f 100644
--- a/tests/spec/oracle/Extend_conflict.res.oracle
+++ b/tests/spec/oracle/Extend_conflict.res.oracle
@@ -2,5 +2,5 @@
   Trying to register ACSL extension foo twice. Ignoring second extension
 [kernel] Parsing Extend_conflict.i (no preprocessing)
 [kernel] Extend_conflict.i:7: User Error: 
-  Extension foo is from myplugin and not eva
+  Extension 'foo' is from myplugin and not eva
 [kernel] Frama-C aborted: invalid user input.
diff --git a/tests/spec/oracle/Extend_kernel.res.oracle b/tests/spec/oracle/Extend_kernel.res.oracle
new file mode 100644
index 00000000000..80c8ec0df28
--- /dev/null
+++ b/tests/spec/oracle/Extend_kernel.res.oracle
@@ -0,0 +1,4 @@
+[kernel] Parsing Extend_kernel.i (no preprocessing)
+[kernel] Extend_kernel.i:11: User Error: 
+  Extension 'calls' from frama-c's kernel should not be used with the syntax \kernel::calls
+[kernel] Frama-C aborted: invalid user input.
diff --git a/tests/spec/oracle/Extend_warning.res.oracle b/tests/spec/oracle/Extend_warning.res.oracle
index e897425bd86..204dbfafe71 100644
--- a/tests/spec/oracle/Extend_warning.res.oracle
+++ b/tests/spec/oracle/Extend_warning.res.oracle
@@ -2,7 +2,7 @@
   Trying to register ACSL extension foo twice. Ignoring second extension
 [kernel] Parsing Extend_warning.i (no preprocessing)
 [kernel:extension-unknown] Extend_warning.i:7: Warning: 
-  Unregistered extension bar for plug-in myplugin
+  Unregistered extension 'bar' for plug-in myplugin
 [kernel:plugin-not-loaded] Extend_warning.i:8: Warning: 
   Ignored extensions for unloaded plug-in unknown_plugin
 /* Generated by Frama-C */
-- 
GitLab