Commit b5228b1b by Martin Sebor

PR middle-end/94004 - missing -Walloca on calls to alloca due to -Wno-system-headers

gcc/testsuite/ChangeLog:

	PR middle-end/94004
	* gcc.dg/Walloca-larger-than-3.c: New test.
	* gcc.dg/Walloca-larger-than-3.h: New test header.
	* gcc.dg/Wvla-larger-than-4.c: New test.

gcc/ChangeLog:

	PR middle-end/94004
	* gimple-ssa-warn-alloca.c (pass_walloca::execute): Issue warnings
	even for alloca calls resulting from system macro expansion.
	Include inlining context in all warnings.
parent 713ecb3d
2020-03-25 Martin Sebor <msebor@redhat.com>
PR middle-end/94004
* gimple-ssa-warn-alloca.c (pass_walloca::execute): Issue warnings
even for alloca calls resulting from system macro expansion.
Include inlining context in all warnings.
2020-03-25 Richard Sandiford <richard.sandiford@arm.com> 2020-03-25 Richard Sandiford <richard.sandiford@arm.com>
PR target/94254 PR target/94254
......
...@@ -510,11 +510,12 @@ pass_walloca::execute (function *fun) ...@@ -510,11 +510,12 @@ pass_walloca::execute (function *fun)
gsi_next (&si)) gsi_next (&si))
{ {
gimple *stmt = gsi_stmt (si); gimple *stmt = gsi_stmt (si);
location_t loc = gimple_location (stmt);
if (!gimple_alloca_call_p (stmt)) if (!gimple_alloca_call_p (stmt))
continue; continue;
location_t loc = gimple_nonartificial_location (stmt);
loc = expansion_point_location_if_in_system_header (loc);
const bool is_vla const bool is_vla
= gimple_call_alloca_for_var_p (as_a <gcall *> (stmt)); = gimple_call_alloca_for_var_p (as_a <gcall *> (stmt));
...@@ -528,7 +529,7 @@ pass_walloca::execute (function *fun) ...@@ -528,7 +529,7 @@ pass_walloca::execute (function *fun)
} }
else if (warn_alloca) else if (warn_alloca)
{ {
warning_at (loc, OPT_Walloca, "use of %<alloca%>"); warning_at (loc, OPT_Walloca, "%Guse of %<alloca%>", stmt);
continue; continue;
} }
else if (warn_alloca_limit < 0) else if (warn_alloca_limit < 0)
...@@ -564,10 +565,12 @@ pass_walloca::execute (function *fun) ...@@ -564,10 +565,12 @@ pass_walloca::execute (function *fun)
{ {
auto_diagnostic_group d; auto_diagnostic_group d;
if (warning_at (loc, wcode, if (warning_at (loc, wcode,
is_vla ? G_("argument to variable-length " (is_vla
"array may be too large") ? G_("%Gargument to variable-length "
: G_("argument to %<alloca%> may be too " "array may be too large")
"large")) : G_("%Gargument to %<alloca%> may be too "
"large")),
stmt)
&& t.limit != 0) && t.limit != 0)
{ {
print_decu (t.limit, buff); print_decu (t.limit, buff);
...@@ -582,47 +585,57 @@ pass_walloca::execute (function *fun) ...@@ -582,47 +585,57 @@ pass_walloca::execute (function *fun)
{ {
auto_diagnostic_group d; auto_diagnostic_group d;
if (warning_at (loc, wcode, if (warning_at (loc, wcode,
is_vla ? G_("argument to variable-length" (is_vla
" array is too large") ? G_("%Gargument to variable-length"
: G_("argument to %<alloca%> is too large")) " array is too large")
: G_("%Gargument to %<alloca%> is too large")),
stmt)
&& t.limit != 0) && t.limit != 0)
{ {
print_decu (t.limit, buff); print_decu (t.limit, buff);
inform (loc, "limit is %wu bytes, but argument is %s", inform (loc, "limit is %wu bytes, but argument is %s",
is_vla ? warn_vla_limit : adjusted_alloca_limit, is_vla ? warn_vla_limit : adjusted_alloca_limit,
buff); buff);
} }
} }
break; break;
case ALLOCA_BOUND_UNKNOWN: case ALLOCA_BOUND_UNKNOWN:
warning_at (loc, wcode, warning_at (loc, wcode,
is_vla ? G_("variable-length array bound is unknown") (is_vla
: G_("%<alloca%> bound is unknown")); ? G_("%Gvariable-length array bound is unknown")
: G_("%G%<alloca%> bound is unknown")),
stmt);
break; break;
case ALLOCA_UNBOUNDED: case ALLOCA_UNBOUNDED:
warning_at (loc, wcode, warning_at (loc, wcode,
is_vla ? G_("unbounded use of variable-length array") (is_vla
: G_("unbounded use of %<alloca%>")); ? G_("%Gunbounded use of variable-length array")
: G_("%Gunbounded use of %<alloca%>")),
stmt);
break; break;
case ALLOCA_IN_LOOP: case ALLOCA_IN_LOOP:
gcc_assert (!is_vla); gcc_assert (!is_vla);
warning_at (loc, wcode, "use of %<alloca%> within a loop"); warning_at (loc, wcode,
"%Guse of %<alloca%> within a loop", stmt);
break; break;
case ALLOCA_CAST_FROM_SIGNED: case ALLOCA_CAST_FROM_SIGNED:
gcc_assert (invalid_casted_type != NULL_TREE); gcc_assert (invalid_casted_type != NULL_TREE);
warning_at (loc, wcode, warning_at (loc, wcode,
is_vla ? G_("argument to variable-length array " (is_vla
"may be too large due to " ? G_("%Gargument to variable-length array "
"conversion from %qT to %qT") "may be too large due to "
: G_("argument to %<alloca%> may be too large " "conversion from %qT to %qT")
"due to conversion from %qT to %qT"), : G_("%Gargument to %<alloca%> may be too large "
invalid_casted_type, size_type_node); "due to conversion from %qT to %qT")),
stmt, invalid_casted_type, size_type_node);
break; break;
case ALLOCA_ARG_IS_ZERO: case ALLOCA_ARG_IS_ZERO:
warning_at (loc, wcode, warning_at (loc, wcode,
is_vla ? G_("argument to variable-length array " (is_vla
"is zero") ? G_("%Gargument to variable-length array "
: G_("argument to %<alloca%> is zero")); "is zero")
: G_("%Gargument to %<alloca%> is zero")),
stmt);
break; break;
default: default:
gcc_unreachable (); gcc_unreachable ();
......
2020-03-25 Martin Sebor <msebor@redhat.com>
PR middle-end/94004
* gcc.dg/Walloca-larger-than-3.c: New test.
* gcc.dg/Walloca-larger-than-3.h: New test header.
* gcc.dg/Wvla-larger-than-4.c: New test.
2020-03-25 Patrick Palka <ppalka@redhat.com> 2020-03-25 Patrick Palka <ppalka@redhat.com>
PR c++/94265 PR c++/94265
......
/* PR middle-end/94004 - missing -Walloca on calls to alloca due
to -Wno-system-headers
{ dg-do compile }
{ dg-options "-O2 -Wall -Walloca-larger-than=8 -ftrack-macro-expansion=0" }
{ dg-require-effective-target alloca } */
#include "Walloca-larger-than-3.h"
void sink (void*, ...);
void call_builtin_alloca (int n)
{
if (n < 9)
n = 9;
void *p = __builtin_alloca (n); // { dg-warning "\\\[-Walloca-larger-than" }
sink (p, 0);
}
void call_alloca_sys_hdr (int n)
{
if (n < 9)
n = 9;
void *p = alloca (n); // { dg-warning "\\\[-Walloca-larger-than" }
sink (p, 1);
}
static inline void inline_call_alloca (int n)
{
if (n > 9)
n = 9;
void *p = alloca (n); // { dg-warning "\\\[-Walloca-larger-than" }
sink (p, 2);
}
void make_inlined_call (void)
{
inline_call_alloca (10);
}
#if __has_include (<alloca.h>)
# include <alloca.h>
#endif
#ifndef alloca
/* Simulate a definition in a system header. */
# pragma GCC system_header
# define alloca(n) __builtin_alloca (n)
#endif
/* PR middle-end/94004 - missing -Walloca on calls to alloca due
to -Wno-system-headers
{ dg-do compile }
{ dg-options "-O2 -Wall -Wvla-larger-than=31 -ftrack-macro-expansion=0" }
{ dg-require-effective-target alloca } */
void sink (void*, ...);
static inline void inline_use_vla (unsigned n)
{
if (n > 32)
n = 32;
char a[n]; // { dg-warning "\\\[-Wvla-larger-than" }
sink (a, 2);
}
static inline void use_inlined_vla (unsigned n)
{
inline_use_vla (n); // this call is okay
inline_use_vla (n + 1); // this one is not
}
void call_inline (void)
{
use_inlined_vla (31);
}
/* Verify that the inlining context is included and that it points
to the correct line number in the inlined function:
{ dg-message "function 'inline_use_vla'..*inlined from 'call_inline' .*:20:" "" { target *-*-* } 0 } */
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment