aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMartin Uecker <uecker@tugraz.at>2023-05-26 11:19:01 +0200
committerMartin Uecker <uecker@tugraz.at>2023-05-26 22:40:28 +0200
commit8d6bd830f5f9c939e8565c0341a0c6c588834484 (patch)
tree3166e14e82eff312bfd4aea581dac5144a0c9f96
parenta1b23dcf2337ab8666fac7d1e191ca987710d184 (diff)
downloadgcc-8d6bd830f5f9c939e8565c0341a0c6c588834484.zip
gcc-8d6bd830f5f9c939e8565c0341a0c6c588834484.tar.gz
gcc-8d6bd830f5f9c939e8565c0341a0c6c588834484.tar.bz2
c: -Wstringop-overflow for parameters with forward-declared sizes
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.
-rw-r--r--gcc/c-family/c-attribs.cc9
-rw-r--r--gcc/testsuite/gcc.dg/pr109970.c15
2 files changed, 24 insertions, 0 deletions
diff --git a/gcc/c-family/c-attribs.cc b/gcc/c-family/c-attribs.cc
index 072cfb6..e2792ca 100644
--- a/gcc/c-family/c-attribs.cc
+++ b/gcc/c-family/c-attribs.cc
@@ -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
index 0000000..068c01f
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/pr109970.c
@@ -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" } */
+}
+