]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
a68: fix uninitialized memory in get_hole_symbol [PR algol68/124115] master trunk
authorJose E. Marchesi <jemarch@gnu.org>
Mon, 16 Feb 2026 20:32:59 +0000 (21:32 +0100)
committerJose E. Marchesi <jemarch@gnu.org>
Mon, 16 Feb 2026 20:34:13 +0000 (21:34 +0100)
The function get_hole_symbol is supposed to set *addrp to either true
or false.  However it was only setting it to false, causing
uninitialized memory.

This patch also removes a gcc_asser tfrom a68_make_formal_hole_decl.
If the formal hole results in an empty symbol then it may result into
invalid assembly being generated, but that is akin to use an invalid
asm template.

Signed-off-by: Jose E. Marchesi <jemarch@gnu.org>
gcc/algol68/ChangeLog

PR algol68/124115
* a68-low-holes.cc (get_hole_symbol): Always set *addrp to avoid
uninitialized memory.
* a68-low.cc (a68_make_formal_hole_decl): Remove assert.

gcc/testsuite/ChangeLog

PR algol68/124115
* algol68/compile/formal-hole-2.a68: New test.

gcc/algol68/a68-low-holes.cc
gcc/algol68/a68-low.cc
gcc/testsuite/algol68/compile/formal-hole-2.a68 [new file with mode: 0644]

index 3eca4e4e0b2aea924abe14a781bd7e80b2c4a771..eaf4ddfecb32b376ae3fd3a6cc52aabd1679d258 100644 (file)
@@ -57,12 +57,15 @@ get_hole_symbol (NODE_T *p, bool *addrp)
   gcc_assert (IS (str, ROW_CHAR_DENOTATION));
 
   const char *cstr = NSYMBOL (str);
-  if (strlen (cstr) > 0 && cstr[0] == '&' && addrp != NULL)
+  bool isaddr = false;
+  if (strlen (cstr) > 0 && cstr[0] == '&')
     {
-      *addrp = true;
+      isaddr = true;
       cstr = cstr + 1;
     }
 
+  if (addrp != NULL)
+    *addrp = isaddr;
   return a68_string_process_breaks (p, cstr);
 }
 
index dcc974ad67d118b425027f3d9cc8cc86a03151ae..7df38c801e6351266df1b3371c1cbf2ea81a05c3 100644 (file)
@@ -642,8 +642,7 @@ a68_make_formal_hole_decl (NODE_T *p, const char *extern_symbol)
               ? TREE_TYPE (CTYPE (MOID (p)))
               : CTYPE (MOID (p)));
 
-  gcc_assert (strlen (extern_symbol) > 0);
-  const char *sym = (extern_symbol[0] == '&'
+  const char *sym = (strlen (extern_symbol) > 0 && extern_symbol[0] == '&'
                     ? extern_symbol + 1
                     : extern_symbol);
 
diff --git a/gcc/testsuite/algol68/compile/formal-hole-2.a68 b/gcc/testsuite/algol68/compile/formal-hole-2.a68
new file mode 100644 (file)
index 0000000..9337a04
--- /dev/null
@@ -0,0 +1,6 @@
+{ Freestanding formal hole with &.  }
+
+begin
+      ref int foo = nest C "&foo";
+      skip
+end