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.
This commit is contained in:
Martin Uecker 2023-05-26 11:19:01 +02:00
parent a1b23dcf23
commit 8d6bd830f5
2 changed files with 24 additions and 0 deletions

View 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)

View file

@ -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" } */
}