]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
c: -Wstringop-overflow for parameters with forward-declared sizes
authorMartin Uecker <uecker@tugraz.at>
Fri, 26 May 2023 09:19:01 +0000 (11:19 +0200)
committerMartin Uecker <uecker@tugraz.at>
Fri, 26 May 2023 20:40:28 +0000 (22:40 +0200)
Warnings from -Wstringop-overflow do not appear for parameters declared
as VLAs when the bound refers to a parameter forward declaration. This
is fixed by splitting the loop that passes through parameters into two,
first only recording the positions of all possible size expressions
and then processing the parameters.

PR c/109970

gcc/c-family:

* c-attribs.cc (build_attr_access_from_parms): Split loop to first
record all parameters.

gcc/testsuite:

* gcc.dg/pr109970.c: New test.

gcc/c-family/c-attribs.cc
gcc/testsuite/gcc.dg/pr109970.c [new file with mode: 0644]

index 072cfb69147bd6b314459c0bd48a0c1fb92d3e4d..e2792ca6898b35bd5753ea3288e9ec433d314dc8 100644 (file)
@@ -5278,6 +5278,15 @@ build_attr_access_from_parms (tree parms, bool skip_voidptr)
       tree argtype = TREE_TYPE (arg);
       if (DECL_NAME (arg) && INTEGRAL_TYPE_P (argtype))
        arg2pos.put (arg, argpos);
+    }
+
+  argpos = 0;
+  for (tree arg = parms; arg; arg = TREE_CHAIN (arg), ++argpos)
+    {
+      if (!DECL_P (arg))
+       continue;
+
+      tree argtype = TREE_TYPE (arg);
 
       tree argspec = DECL_ATTRIBUTES (arg);
       if (!argspec)
diff --git a/gcc/testsuite/gcc.dg/pr109970.c b/gcc/testsuite/gcc.dg/pr109970.c
new file mode 100644 (file)
index 0000000..068c01f
--- /dev/null
@@ -0,0 +1,15 @@
+/* PR109970
+ * { dg-do compile }
+ * { dg-options "-Wstringop-overflow" }
+ * */
+
+void bar(int x, char buf[x]);
+void foo(int x; char buf[x], int x);
+
+int main()
+{
+       char buf[10];
+       bar(11, buf);   /* { dg-warning "accessing 11 bytes in a region of size 10" } */
+       foo(buf, 11);   /* { dg-warning "accessing 11 bytes in a region of size 10" } */
+}
+