blob: 7b47b045b1184aa761b994a98489856fb6751dce [file] [log] [blame]
/* PR c/78284 - warn on malloc with very large arguments
Test to exercise the interaction of the -Walloca-larger-than,
-Wvla-larger-than, and -Walloc-size-larger-than options. The former
two more specific options override the more general latter option. */
/* { dg-do compile } */
/* { dg-require-effective-target alloca } */
/* { dg-options "-O -Walloc-size-larger-than=123 -Walloca-larger-than=234 -Wvla-larger-than=345" } */
typedef __SIZE_TYPE__ size_t;
void sink (void*);
static size_t alloc_size_limit (void)
{
return 123;
}
static size_t alloca_limit (void)
{
return 234;
}
static size_t vla_limit (void)
{
return 345;
}
void test_alloca (void)
{
void *p;
/* No warning should be issued for the following call because the more
permissive alloca limit overrides the stricter alloc_size limit. */
p = __builtin_alloca (alloca_limit ());
sink (p);
p = __builtin_alloca (alloca_limit () + 1); /* { dg-warning "argument to .alloca. is too large" } */
sink (p);
}
void test_vla (void)
{
/* Same as above, no warning should be issued here because the more
permissive VLA limit overrides the stricter alloc_size limit. */
char vla1 [vla_limit ()];
sink (vla1);
char vla2 [vla_limit () + 1]; /* { dg-warning "argument to variable-length array is too large" } */
sink (vla2);
}
void test_malloc (void)
{
void *p;
p = __builtin_malloc (alloc_size_limit ());
sink (p);
p = __builtin_malloc (alloc_size_limit () + 1); /* { dg-warning "argument 1 value .124\[lu\]*. exceeds maximum object size 123" } */
sink (p);
}