bug-bison
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: Bogus Bison 3.8.2 warning: suspicious sequence in the output


From: Akim Demaille
Subject: Re: Bogus Bison 3.8.2 warning: suspicious sequence in the output
Date: Sun, 7 Nov 2021 09:53:28 +0100


> Le 6 nov. 2021 à 20:09, Akim Demaille <akim@lrde.epita.fr> a écrit :
> 
> Hum...  Actually "escaping" the user's input to avoid the warning would be a 
> better option.  I'll think about it.

I'm installing this on top of the previous commit.

commit c559b05fc9336d70eee6ef2bcabf949ed5d92a39
Author: Akim Demaille <akim.demaille@gmail.com>
Date:   Sun Nov 7 09:27:52 2021 +0100

    warnings: don't complain about m4_foo and b4_foo when from the user
    
    Currently, occurrences of these identifiers in the user's input yield
    spurious warnings.
    
    To tell the difference between a legitimate m4_foo from the user, and
    a bad m4_foo coming from a non-evaluated macro of a skeleton, escape
    the user's identifiers as m4@'_foo.  We already use @' as a special
    sequence to be stripped from the skeleton's output.
    
    See <https://lists.gnu.org/r/bug-bison/2021-10/msg00026.html> and
    previous commit ("warnings: be less picky about occurrences of m4_/b4_
    in the output").
    
    * src/flex-scanner.h (OBSTACK_SGROW): New.
    * src/output.c (output_escaped): Escape m4_ and b4_.
    * src/scan-code.l: Likewise.
    * src/system.h (obstack_escape): Likewise.
    And rewrite as a function.
    * tests/skeletons.at (Suspicious sequences): Make sure the user can
    use m4_foo/b4_foo without spurious warnings.

diff --git a/NEWS b/NEWS
index 1fa344cf..1b7ea390 100644
--- a/NEWS
+++ b/NEWS
@@ -2,6 +2,9 @@ GNU Bison NEWS
 
 * Noteworthy changes in release ?.? (????-??-??) [?]
 
+  Fixed portability issues of the test suite on Solaris.
+
+  Fixed spurious warnings about input containing `m4_` or `b4_`.
 
 * Noteworthy changes in release 3.8.2 (2021-09-25) [stable]
 
diff --git a/src/flex-scanner.h b/src/flex-scanner.h
index 238ca881..08c0e62c 100644
--- a/src/flex-scanner.h
+++ b/src/flex-scanner.h
@@ -106,6 +106,9 @@ static struct obstack obstack_for_string;
 # define STRING_GROW()                                  \
   obstack_grow (&obstack_for_string, yytext, yyleng)
 
+# define STRING_SGROW(String)                   \
+  obstack_sgrow (&obstack_for_string, String)
+
 # define STRING_FINISH()                                \
   (last_string = obstack_finish0 (&obstack_for_string))
 
diff --git a/src/output.c b/src/output.c
index 4b1bb0d8..07234f2a 100644
--- a/src/output.c
+++ b/src/output.c
@@ -104,20 +104,45 @@ GENERATE_MUSCLE_INSERT_TABLE 
(muscle_insert_symbol_number_table, symbol_number)
 GENERATE_MUSCLE_INSERT_TABLE (muscle_insert_item_number_table, item_number)
 GENERATE_MUSCLE_INSERT_TABLE (muscle_insert_state_number_table, state_number)
 
+
 /*----------------------------------------------------------------.
 | Print to OUT a representation of CP quoted and escaped for M4.  |
+|                                                                 |
+| Keep sync'ed with obstack_escape.                               |
 `----------------------------------------------------------------*/
 
 static void
 output_escaped (FILE *out, const char *cp)
 {
-  for (; *cp; cp++)
+  for (; *cp; ++cp)
     switch (*cp)
       {
       case '$': fputs ("$][", out); break;
       case '@': fputs ("@@",  out); break;
       case '[': fputs ("@{",  out); break;
       case ']': fputs ("@}",  out); break;
+
+      case 'b':
+        if (STRPREFIX_LIT ("b4_", cp))
+          {
+            fputs ("b4@'_", out);
+            cp += strlen ("b4_") - 1;
+            break;
+          }
+        else
+          goto append;
+
+      case 'm':
+        if (STRPREFIX_LIT ("m4_", cp))
+          {
+            fputs ("m4@'_", out);
+            cp += strlen ("m4_") - 1;
+            break;
+          }
+        else
+          goto append;
+
+      append:
       default:  fputc (*cp,   out); break;
       }
 }
diff --git a/src/scan-code.l b/src/scan-code.l
index fced37d2..e3e765c8 100644
--- a/src/scan-code.l
+++ b/src/scan-code.l
@@ -197,6 +197,9 @@ ref      -?[0-9]+|{id}|"["{id}"]"|"$"
 
 <*>
 {
+  "b4_"   STRING_SGROW ("b4@'_");
+  "m4_"   STRING_SGROW ("m4@'_");
+
   /* Escape M4 quoting characters in C code.  */
   [$@\[\]]    obstack_escape (&obstack_for_string, yytext);
 
diff --git a/src/system.h b/src/system.h
index bbdf9fd0..630ef646 100644
--- a/src/system.h
+++ b/src/system.h
@@ -204,24 +204,53 @@ max_int (int a, int b)
   } while (0)
 
 
-/* Output Str escaped for our postprocessing (i.e., escape M4 special
+/* Output CP escaped for our postprocessing (i.e., escape M4 special
    characters).
 
-   For instance "[foo]" -> "@{foo@}", "$$" -> "$][$][". */
+   For instance "[foo]" -> "@{foo@}", "$$" -> "$][$][".
 
-# define obstack_escape(Obs, Str)                       \
-  do {                                                  \
-    char const *p__;                                    \
-    for (p__ = Str; *p__; p__++)                        \
-      switch (*p__)                                     \
-        {                                               \
-        case '$': obstack_sgrow (Obs, "$]["); break;    \
-        case '@': obstack_sgrow (Obs, "@@" ); break;    \
-        case '[': obstack_sgrow (Obs, "@{" ); break;    \
-        case ']': obstack_sgrow (Obs, "@}" ); break;    \
-        default:  obstack_1grow (Obs, *p__ ); break;    \
-        }                                               \
-  } while (0)
+   All the user's input passed to m4 is processed by this function or
+   by output_escaped, except user actions.  Because of the specific
+   handling of @$, @1, etc., user actions are processed (and escaped)
+   by scan-code.l.
+
+   Keep output_escaped and obstack_escape sync'ed.
+ */
+
+static inline void
+obstack_escape (struct obstack* obs, const char *cp)
+{
+  for (; *cp; ++cp)
+    switch (*cp)
+      {
+      case '$': obstack_sgrow (obs, "$]["); break;
+      case '@': obstack_sgrow (obs, "@@" ); break;
+      case '[': obstack_sgrow (obs, "@{" ); break;
+      case ']': obstack_sgrow (obs, "@}" ); break;
+      case 'b':
+        if (STRPREFIX_LIT ("b4_", cp))
+          {
+            obstack_sgrow (obs, "b4@'_");
+            cp += strlen ("b4_") - 1;
+            break;
+          }
+        else
+          goto append;
+
+      case 'm':
+        if (STRPREFIX_LIT ("m4_", cp))
+          {
+            obstack_sgrow (obs, "m4@'_");
+            cp += strlen ("m4_") - 1;
+            break;
+          }
+        else
+          goto append;
+
+      append:
+      default:  obstack_1grow (obs, *cp); break;
+      }
+}
 
 
 /* Output Str both quoted for M4 (i.e., embed in [[...]]), and escaped
diff --git a/tests/skeletons.at b/tests/skeletons.at
index 30f25a61..8cd87f96 100644
--- a/tests/skeletons.at
+++ b/tests/skeletons.at
@@ -332,14 +332,18 @@ AT_SETUP([[Fatal errors but M4 continues producing 
output]])
 
 AT_SETUP([[Suspicious sequences]])
 
+# <https://lists.gnu.org/r/bug-bison/2021-10/msg00026.html>.
+
+# We must escape m4_foo as m4@&t@_foo to avoid Autotest's protection
+# against its own suspicious sequences.
 AT_DATA([[skel.c]],
 [[m4@&t@_include(b4_skeletonsdir/[c.m4])
 m4@&t@_divert_push(0)d@&t@nl
 @output(b4_parser_file_name@)d@&t@nl
 ]b4_user_pre_prologue[
 ]b4_user_post_prologue[
-b4_unevaluated
-m4@&t@_unevaluated
+b4_poison
+m4@&t@_poison
 ]b4_epilogue[
 
 m4@&t@_divert_pop(0)
@@ -348,19 +352,21 @@ AT_SETUP([[Suspicious sequences]])
 AT_DATA([[input1.y]],
 [[%skeleton "./skel.c"
 %{
-  myb4_unevaluated
-  mym4_unevaluated
+  myb4_user
+  mym4_user
+  b4_user
+  m4@&t@_user
 %}
 %%
-start: ;
+b4_user: "b4_user";
 %%
-myb4_unevaluated
-mym4_unevaluated
+b4_user
+m4@&t@_user
 ]])
 
 AT_BISON_CHECK([[input1.y]], [], [],
-[[input1.tab.c:10: warning: suspicious sequence in the output: b4_unevaluated 
[-Wother]
-input1.tab.c:11: warning: suspicious sequence in the output: 
m4@&t@_unevaluated [-Wother]
+[[input1.tab.c:12: warning: suspicious sequence in the output: b4_poison 
[-Wother]
+input1.tab.c:13: warning: suspicious sequence in the output: m4@&t@_poison 
[-Wother]
 ]])
 
 




reply via email to

[Prev in Thread] Current Thread [Next in Thread]