PR c/82063 - issues with arguments enabled by -Wall
gcc/c-family/ChangeLog: PR c/82063 * c.opt (-Wno-alloc-size-larger-than): New option. * doc/invoke.texi (-Walloc-size-larger-than): Update. gcc/ChangeLog: PR c/82063 * calls.c (alloc_max_size): Correct a logic error/typo. Treat excessive arguments as infinite. Warn for invalid arguments. gcc/testsuite/ChangeLog: PR c/82063 * gcc.dg/Walloc-size-larger-than-1.c: New test. * gcc.dg/Walloc-size-larger-than-10.c: New test. * gcc.dg/Walloc-size-larger-than-11.c: New test. * gcc.dg/Walloc-size-larger-than-12.c: New test. * gcc.dg/Walloc-size-larger-than-13.c: New test. * gcc.dg/Walloc-size-larger-than-14.c: New test. * gcc.dg/Walloc-size-larger-than-15.c: New test. * gcc.dg/Walloc-size-larger-than-16.c: New test. * gcc.dg/Walloc-size-larger-than-17.c: New test. * gcc.dg/Walloc-size-larger-than-2.c: New test. * gcc.dg/Walloc-size-larger-than-3.c: New test. * gcc.dg/Walloc-size-larger-than-4.c: New test. * gcc.dg/Walloc-size-larger-than-5.c: New test. * gcc.dg/Walloc-size-larger-than-6.c: New test. * gcc.dg/Walloc-size-larger-than-7.c: New test. * gcc.dg/Walloc-size-larger-than-8.c: New test. * gcc.dg/Walloc-size-larger-than-9.c: New test. * gcc.dg/Walloc-size-larger-than.c: New test. From-SVN: r261030
This commit is contained in:
parent
3217e69485
commit
d258f4aa69
24 changed files with 562 additions and 58 deletions
|
@ -1,3 +1,10 @@
|
|||
2018-05-31 Martin Sebor <msebor@redhat.com>
|
||||
|
||||
PR c/82063
|
||||
* calls.c (alloc_max_size): Correct a logic error/typo.
|
||||
Treat excessive arguments as infinite. Warn for invalid arguments.
|
||||
* doc/invoke.texi (-Walloc-size-larger-than): Update.
|
||||
|
||||
2018-05-31 H.J. Lu <hongjiu.lu@intel.com>
|
||||
|
||||
PR target/85829
|
||||
|
|
|
@ -1,3 +1,8 @@
|
|||
2018-05-31 Martin Sebor <msebor@redhat.com>
|
||||
|
||||
PR c/82063
|
||||
* c.opt (-Wno-alloc-size-larger-than): New option.
|
||||
|
||||
2018-04-22 David Pagan <dave.pagan@oracle.com>
|
||||
|
||||
PR c/55976
|
||||
|
|
|
@ -308,6 +308,10 @@ C ObjC C++ LTO ObjC++ Var(warn_alloc_size_limit) Warning Joined LangEnabledBy(C
|
|||
-Walloc-size-larger-than=<bytes> Warn for calls to allocation functions that
|
||||
attempt to allocate objects larger than the specified number of bytes.
|
||||
|
||||
Wno-alloc-size-larger-than
|
||||
C ObjC C++ LTO ObjC++ Alias(Walloc-size-larger-than=, 18446744073709551615EiB,none) Warning
|
||||
-Wno-alloc-size-larger-than Disable Walloc-size-larger-than= warning. Equivalent to Walloc-size-larger-than=<SIZE_MAX> or larger.
|
||||
|
||||
Walloc-zero
|
||||
C ObjC C++ ObjC++ Var(warn_alloc_zero) Warning
|
||||
-Walloc-zero Warn for calls to allocation functions that specify zero bytes.
|
||||
|
|
124
gcc/calls.c
124
gcc/calls.c
|
@ -1231,65 +1231,81 @@ static GTY(()) tree alloc_object_size_limit;
|
|||
static tree
|
||||
alloc_max_size (void)
|
||||
{
|
||||
if (!alloc_object_size_limit)
|
||||
if (alloc_object_size_limit)
|
||||
return alloc_object_size_limit;
|
||||
|
||||
alloc_object_size_limit = max_object_size ();
|
||||
|
||||
if (!warn_alloc_size_limit)
|
||||
return alloc_object_size_limit;
|
||||
|
||||
const char *optname = "-Walloc-size-larger-than=";
|
||||
|
||||
char *end = NULL;
|
||||
errno = 0;
|
||||
unsigned HOST_WIDE_INT unit = 1;
|
||||
unsigned HOST_WIDE_INT limit
|
||||
= strtoull (warn_alloc_size_limit, &end, 10);
|
||||
|
||||
/* If the value is too large to be represented use the maximum
|
||||
representable value that strtoull sets limit to (setting
|
||||
errno to ERANGE). */
|
||||
|
||||
if (end && *end)
|
||||
{
|
||||
alloc_object_size_limit = max_object_size ();
|
||||
|
||||
if (warn_alloc_size_limit)
|
||||
/* Numeric option arguments are at most INT_MAX. Make it
|
||||
possible to specify a larger value by accepting common
|
||||
suffixes. */
|
||||
if (!strcmp (end, "kB"))
|
||||
unit = 1000;
|
||||
else if (!strcasecmp (end, "KiB") || !strcmp (end, "KB"))
|
||||
unit = 1024;
|
||||
else if (!strcmp (end, "MB"))
|
||||
unit = HOST_WIDE_INT_UC (1000) * 1000;
|
||||
else if (!strcasecmp (end, "MiB"))
|
||||
unit = HOST_WIDE_INT_UC (1024) * 1024;
|
||||
else if (!strcasecmp (end, "GB"))
|
||||
unit = HOST_WIDE_INT_UC (1000) * 1000 * 1000;
|
||||
else if (!strcasecmp (end, "GiB"))
|
||||
unit = HOST_WIDE_INT_UC (1024) * 1024 * 1024;
|
||||
else if (!strcasecmp (end, "TB"))
|
||||
unit = HOST_WIDE_INT_UC (1000) * 1000 * 1000 * 1000;
|
||||
else if (!strcasecmp (end, "TiB"))
|
||||
unit = HOST_WIDE_INT_UC (1024) * 1024 * 1024 * 1024;
|
||||
else if (!strcasecmp (end, "PB"))
|
||||
unit = HOST_WIDE_INT_UC (1000) * 1000 * 1000 * 1000 * 1000;
|
||||
else if (!strcasecmp (end, "PiB"))
|
||||
unit = HOST_WIDE_INT_UC (1024) * 1024 * 1024 * 1024 * 1024;
|
||||
else if (!strcasecmp (end, "EB"))
|
||||
unit = HOST_WIDE_INT_UC (1000) * 1000 * 1000 * 1000 * 1000
|
||||
* 1000;
|
||||
else if (!strcasecmp (end, "EiB"))
|
||||
unit = HOST_WIDE_INT_UC (1024) * 1024 * 1024 * 1024 * 1024
|
||||
* 1024;
|
||||
else
|
||||
{
|
||||
char *end = NULL;
|
||||
errno = 0;
|
||||
unsigned HOST_WIDE_INT unit = 1;
|
||||
unsigned HOST_WIDE_INT limit
|
||||
= strtoull (warn_alloc_size_limit, &end, 10);
|
||||
/* This could mean an unknown suffix or a bad prefix, like
|
||||
"+-1". */
|
||||
warning_at (UNKNOWN_LOCATION, 0,
|
||||
"invalid argument %qs to %qs",
|
||||
warn_alloc_size_limit, optname);
|
||||
|
||||
if (!errno)
|
||||
{
|
||||
if (end && *end)
|
||||
{
|
||||
/* Numeric option arguments are at most INT_MAX. Make it
|
||||
possible to specify a larger value by accepting common
|
||||
suffixes. */
|
||||
if (!strcmp (end, "kB"))
|
||||
unit = 1000;
|
||||
else if (!strcasecmp (end, "KiB") || strcmp (end, "KB"))
|
||||
unit = 1024;
|
||||
else if (!strcmp (end, "MB"))
|
||||
unit = HOST_WIDE_INT_UC (1000) * 1000;
|
||||
else if (!strcasecmp (end, "MiB"))
|
||||
unit = HOST_WIDE_INT_UC (1024) * 1024;
|
||||
else if (!strcasecmp (end, "GB"))
|
||||
unit = HOST_WIDE_INT_UC (1000) * 1000 * 1000;
|
||||
else if (!strcasecmp (end, "GiB"))
|
||||
unit = HOST_WIDE_INT_UC (1024) * 1024 * 1024;
|
||||
else if (!strcasecmp (end, "TB"))
|
||||
unit = HOST_WIDE_INT_UC (1000) * 1000 * 1000 * 1000;
|
||||
else if (!strcasecmp (end, "TiB"))
|
||||
unit = HOST_WIDE_INT_UC (1024) * 1024 * 1024 * 1024;
|
||||
else if (!strcasecmp (end, "PB"))
|
||||
unit = HOST_WIDE_INT_UC (1000) * 1000 * 1000 * 1000 * 1000;
|
||||
else if (!strcasecmp (end, "PiB"))
|
||||
unit = HOST_WIDE_INT_UC (1024) * 1024 * 1024 * 1024 * 1024;
|
||||
else if (!strcasecmp (end, "EB"))
|
||||
unit = HOST_WIDE_INT_UC (1000) * 1000 * 1000 * 1000 * 1000
|
||||
* 1000;
|
||||
else if (!strcasecmp (end, "EiB"))
|
||||
unit = HOST_WIDE_INT_UC (1024) * 1024 * 1024 * 1024 * 1024
|
||||
* 1024;
|
||||
else
|
||||
unit = 0;
|
||||
}
|
||||
|
||||
if (unit)
|
||||
{
|
||||
widest_int w = wi::mul (limit, unit);
|
||||
if (w < wi::to_widest (alloc_object_size_limit))
|
||||
alloc_object_size_limit
|
||||
= wide_int_to_tree (ptrdiff_type_node, w);
|
||||
}
|
||||
}
|
||||
/* Ignore the limit extracted by strtoull. */
|
||||
unit = 0;
|
||||
}
|
||||
}
|
||||
|
||||
if (unit)
|
||||
{
|
||||
widest_int w = wi::mul (limit, unit);
|
||||
if (w < wi::to_widest (alloc_object_size_limit))
|
||||
alloc_object_size_limit
|
||||
= wide_int_to_tree (ptrdiff_type_node, w);
|
||||
else
|
||||
alloc_object_size_limit = build_all_ones_cst (size_type_node);
|
||||
}
|
||||
|
||||
|
||||
return alloc_object_size_limit;
|
||||
}
|
||||
|
||||
|
|
|
@ -5510,10 +5510,14 @@ portability bugs and should be avoided.
|
|||
Warn about calls to functions decorated with attribute @code{alloc_size}
|
||||
that attempt to allocate objects larger than the specified number of bytes,
|
||||
or where the result of the size computation in an integer type with infinite
|
||||
precision would exceed @code{SIZE_MAX / 2}. The option argument @var{n}
|
||||
may end in one of the standard suffixes designating a multiple of bytes
|
||||
such as @code{kB} and @code{KiB} for kilobyte and kibibyte, respectively,
|
||||
@code{MB} and @code{MiB} for megabyte and mebibyte, and so on.
|
||||
precision would exceed @code{SIZE_MAX / 2}. The option argument @var{n} is
|
||||
treated as an integer with infinite precision and may end in one of
|
||||
the standard suffixes designating a multiple of bytes such as @code{kB} and
|
||||
@code{KiB} for kilobyte and kibibyte, respectively, @code{MB} and @code{MiB}
|
||||
for megabyte and mebibyte, and so on.
|
||||
@option{-Walloc-size-larger-than=}@var{PTRDIFF_MAX} is enabled by default.
|
||||
Warnings controlled by the option can be disabled either by specifying
|
||||
@var{n} of @var{SIZE_MAX} or more or by @option{-Wno-alloc-size-larger-than}.
|
||||
@xref{Function Attributes}.
|
||||
|
||||
@item -Walloca
|
||||
|
|
|
@ -1,3 +1,25 @@
|
|||
2018-05-31 Martin Sebor <msebor@redhat.com>
|
||||
|
||||
PR c/82063
|
||||
* gcc.dg/Walloc-size-larger-than-1.c: New test.
|
||||
* gcc.dg/Walloc-size-larger-than-10.c: New test.
|
||||
* gcc.dg/Walloc-size-larger-than-11.c: New test.
|
||||
* gcc.dg/Walloc-size-larger-than-12.c: New test.
|
||||
* gcc.dg/Walloc-size-larger-than-13.c: New test.
|
||||
* gcc.dg/Walloc-size-larger-than-14.c: New test.
|
||||
* gcc.dg/Walloc-size-larger-than-15.c: New test.
|
||||
* gcc.dg/Walloc-size-larger-than-16.c: New test.
|
||||
* gcc.dg/Walloc-size-larger-than-17.c: New test.
|
||||
* gcc.dg/Walloc-size-larger-than-2.c: New test.
|
||||
* gcc.dg/Walloc-size-larger-than-3.c: New test.
|
||||
* gcc.dg/Walloc-size-larger-than-4.c: New test.
|
||||
* gcc.dg/Walloc-size-larger-than-5.c: New test.
|
||||
* gcc.dg/Walloc-size-larger-than-6.c: New test.
|
||||
* gcc.dg/Walloc-size-larger-than-7.c: New test.
|
||||
* gcc.dg/Walloc-size-larger-than-8.c: New test.
|
||||
* gcc.dg/Walloc-size-larger-than-9.c: New test.
|
||||
* gcc.dg/Walloc-size-larger-than.c: New test.
|
||||
|
||||
2018-05-31 Chung-Lin Tang <cltang@codesourcery.com>
|
||||
Cesar Philippidis <cesar@codesourcery.com>
|
||||
|
||||
|
|
19
gcc/testsuite/gcc.dg/Walloc-size-larger-than-1.c
Normal file
19
gcc/testsuite/gcc.dg/Walloc-size-larger-than-1.c
Normal file
|
@ -0,0 +1,19 @@
|
|||
/* PR middle-end/82063 - issues with arguments enabled by -Wall
|
||||
{ dg-do compile }
|
||||
{ dg-options "-O -Walloc-size-larger-than=1KB -ftrack-macro-expansion=0" } */
|
||||
|
||||
void sink (void*);
|
||||
|
||||
#define T(x) sink (x)
|
||||
|
||||
void f (void)
|
||||
{
|
||||
unsigned n = 0;
|
||||
T (__builtin_malloc (n));
|
||||
|
||||
n = 1024; /* 1 kibibyte (KB or KiB) */
|
||||
T (__builtin_malloc (n));
|
||||
|
||||
n = 1025;
|
||||
T (__builtin_malloc (n)); /* { dg-warning "argument 1 value .1025. exceeds maximum object size 1024" } */
|
||||
}
|
27
gcc/testsuite/gcc.dg/Walloc-size-larger-than-10.c
Normal file
27
gcc/testsuite/gcc.dg/Walloc-size-larger-than-10.c
Normal file
|
@ -0,0 +1,27 @@
|
|||
/* PR middle-end/82063 - issues with arguments enabled by -Wall
|
||||
{ dg-do compile { target lp64 } }
|
||||
{ dg-options "-O -Walloc-size-larger-than=1PiB -ftrack-macro-expansion=0" } */
|
||||
|
||||
typedef __SIZE_TYPE__ size_t;
|
||||
|
||||
void sink (void*);
|
||||
|
||||
#define T(x) sink (x)
|
||||
|
||||
void f (void)
|
||||
{
|
||||
size_t n = 0;
|
||||
T (__builtin_malloc (n));
|
||||
|
||||
n = (size_t)1024 * 1024 * 1024 * 1024 * 1024; /* 1 pebibyte (PiB) */
|
||||
T (__builtin_malloc (n));
|
||||
|
||||
n += 1;
|
||||
T (__builtin_malloc (n)); /* { dg-warning "argument 1 value .1125899906842625. exceeds maximum object size 1125899906842624" } */
|
||||
|
||||
n = __PTRDIFF_MAX__;
|
||||
T (__builtin_malloc (n)); /* { dg-warning "exceeds maximum object size" } */
|
||||
|
||||
n = __SIZE_MAX__;
|
||||
T (__builtin_malloc (n)); /* { dg-warning "exceeds maximum object size" } */
|
||||
}
|
27
gcc/testsuite/gcc.dg/Walloc-size-larger-than-11.c
Normal file
27
gcc/testsuite/gcc.dg/Walloc-size-larger-than-11.c
Normal file
|
@ -0,0 +1,27 @@
|
|||
/* PR middle-end/82063 - issues with arguments enabled by -Wall
|
||||
{ dg-do compile { target lp64 } }
|
||||
{ dg-options "-O -Walloc-size-larger-than=1PB -ftrack-macro-expansion=0" } */
|
||||
|
||||
typedef __SIZE_TYPE__ size_t;
|
||||
|
||||
void sink (void*);
|
||||
|
||||
#define T(x) sink (x)
|
||||
|
||||
void f (void)
|
||||
{
|
||||
size_t n = 0;
|
||||
T (__builtin_malloc (n));
|
||||
|
||||
n = (size_t)1000 * 1000 * 1000 * 1000 * 1000; /* 1 petabyte (PB) */
|
||||
T (__builtin_malloc (n));
|
||||
|
||||
n += 1;
|
||||
T (__builtin_malloc (n)); /* { dg-warning "argument 1 value .1000000000000001. exceeds maximum object size 1000000000000000" } */
|
||||
|
||||
n = __PTRDIFF_MAX__;
|
||||
T (__builtin_malloc (n)); /* { dg-warning "exceeds maximum object size" } */
|
||||
|
||||
n = __SIZE_MAX__;
|
||||
T (__builtin_malloc (n)); /* { dg-warning "exceeds maximum object size" } */
|
||||
}
|
27
gcc/testsuite/gcc.dg/Walloc-size-larger-than-12.c
Normal file
27
gcc/testsuite/gcc.dg/Walloc-size-larger-than-12.c
Normal file
|
@ -0,0 +1,27 @@
|
|||
/* PR middle-end/82063 - issues with arguments enabled by -Wall
|
||||
{ dg-do compile { target lp64 } }
|
||||
{ dg-options "-O -Walloc-size-larger-than=1EiB -ftrack-macro-expansion=0" } */
|
||||
|
||||
typedef __SIZE_TYPE__ size_t;
|
||||
|
||||
void sink (void*);
|
||||
|
||||
#define T(x) sink (x)
|
||||
|
||||
void f (void)
|
||||
{
|
||||
size_t n = 0;
|
||||
T (__builtin_malloc (n));
|
||||
|
||||
n = (size_t)1024 * 1024 * 1024 * 1024 * 1024 * 1024; /* 1 exbibyte (EiB) */
|
||||
T (__builtin_malloc (n));
|
||||
|
||||
n += 1;
|
||||
T (__builtin_malloc (n)); /* { dg-warning "argument 1 value .1152921504606846977. exceeds maximum object size 1152921504606846976" } */
|
||||
|
||||
n = __PTRDIFF_MAX__;
|
||||
T (__builtin_malloc (n)); /* { dg-warning "exceeds maximum object size" } */
|
||||
|
||||
n = __SIZE_MAX__;
|
||||
T (__builtin_malloc (n)); /* { dg-warning "exceeds maximum object size" } */
|
||||
}
|
27
gcc/testsuite/gcc.dg/Walloc-size-larger-than-13.c
Normal file
27
gcc/testsuite/gcc.dg/Walloc-size-larger-than-13.c
Normal file
|
@ -0,0 +1,27 @@
|
|||
/* PR middle-end/82063 - issues with arguments enabled by -Wall
|
||||
{ dg-do compile { target lp64 } }
|
||||
{ dg-options "-O -Walloc-size-larger-than=1EB -ftrack-macro-expansion=0" } */
|
||||
|
||||
typedef __SIZE_TYPE__ size_t;
|
||||
|
||||
void sink (void*);
|
||||
|
||||
#define T(x) sink (x)
|
||||
|
||||
void f (void)
|
||||
{
|
||||
size_t n = 0;
|
||||
T (__builtin_malloc (n));
|
||||
|
||||
n = (size_t)1000 * 1000 * 1000 * 1000 * 1000 * 1000; /* 1 exabyte (EB) */
|
||||
T (__builtin_malloc (n));
|
||||
|
||||
n += 1;
|
||||
T (__builtin_malloc (n)); /* { dg-warning "argument 1 value .1000000000000000001. exceeds maximum object size 1000000000000000000" } */
|
||||
|
||||
n = __PTRDIFF_MAX__;
|
||||
T (__builtin_malloc (n)); /* { dg-warning "exceeds maximum object size" } */
|
||||
|
||||
n = __SIZE_MAX__;
|
||||
T (__builtin_malloc (n)); /* { dg-warning "exceeds maximum object size" } */
|
||||
}
|
30
gcc/testsuite/gcc.dg/Walloc-size-larger-than-14.c
Normal file
30
gcc/testsuite/gcc.dg/Walloc-size-larger-than-14.c
Normal file
|
@ -0,0 +1,30 @@
|
|||
/* PR middle-end/82063 - issues with arguments enabled by -Wall
|
||||
{ dg-do compile }
|
||||
{ dg-options "-O -Walloc-size-larger-than=123456789123456789123456789123456789 -ftrack-macro-expansion=0" } */
|
||||
|
||||
typedef __SIZE_TYPE__ size_t;
|
||||
|
||||
void sink (void*);
|
||||
|
||||
#define T(x) sink (x)
|
||||
|
||||
/* Verify that an exceedingly large -Walloc-size-larger-than argument
|
||||
with no suffix is accepted and treated as infinite. */
|
||||
|
||||
void f (void)
|
||||
{
|
||||
size_t n = 0;
|
||||
T (__builtin_malloc (n));
|
||||
|
||||
n = __PTRDIFF_MAX__;
|
||||
T (__builtin_malloc (n));
|
||||
|
||||
n += 1;
|
||||
T (__builtin_malloc (n));
|
||||
|
||||
n = __SIZE_MAX__ - 1;
|
||||
T (__builtin_malloc (n));
|
||||
|
||||
n = __SIZE_MAX__;
|
||||
T (__builtin_malloc (n));
|
||||
}
|
30
gcc/testsuite/gcc.dg/Walloc-size-larger-than-15.c
Normal file
30
gcc/testsuite/gcc.dg/Walloc-size-larger-than-15.c
Normal file
|
@ -0,0 +1,30 @@
|
|||
/* PR middle-end/82063 - issues with arguments enabled by -Wall
|
||||
{ dg-do compile }
|
||||
{ dg-options "-O -Walloc-size-larger-than=123456789123456789123456789123456789gb -ftrack-macro-expansion=0" } */
|
||||
|
||||
typedef __SIZE_TYPE__ size_t;
|
||||
|
||||
void sink (void*);
|
||||
|
||||
#define T(x) sink (x)
|
||||
|
||||
/* Verify that an exceeingly large -Walloc-size-larger-than argument
|
||||
with a valid suffic is accepted and treated as infinite. */
|
||||
|
||||
void f (void)
|
||||
{
|
||||
size_t n = 0;
|
||||
T (__builtin_malloc (n));
|
||||
|
||||
n = __PTRDIFF_MAX__;
|
||||
T (__builtin_malloc (n));
|
||||
|
||||
n += 1;
|
||||
T (__builtin_malloc (n));
|
||||
|
||||
n = __SIZE_MAX__ - 1;
|
||||
T (__builtin_malloc (n));
|
||||
|
||||
n = __SIZE_MAX__;
|
||||
T (__builtin_malloc (n));
|
||||
}
|
32
gcc/testsuite/gcc.dg/Walloc-size-larger-than-16.c
Normal file
32
gcc/testsuite/gcc.dg/Walloc-size-larger-than-16.c
Normal file
|
@ -0,0 +1,32 @@
|
|||
/* PR middle-end/82063 - issues with arguments enabled by -Wall
|
||||
{ dg-do compile }
|
||||
{ dg-options "-O -Walloc-size-larger-than=1zb -ftrack-macro-expansion=0" } */
|
||||
|
||||
typedef __SIZE_TYPE__ size_t;
|
||||
|
||||
void sink (void*);
|
||||
|
||||
#define T(x) sink (x)
|
||||
|
||||
/* Verify that an invalid -Walloc-size-larger-than argument is diagnosed
|
||||
and rejected without changing the default setting of PTRDIFF_MAX. */
|
||||
|
||||
void f (void)
|
||||
{
|
||||
size_t n = 0;
|
||||
T (__builtin_malloc (n));
|
||||
|
||||
n = __PTRDIFF_MAX__;
|
||||
T (__builtin_malloc (n));
|
||||
|
||||
n += 1;
|
||||
T (__builtin_malloc (n)); /* { dg-warning "exceeds maximum object size" } */
|
||||
|
||||
n = __SIZE_MAX__ - 1;
|
||||
T (__builtin_malloc (n)); /* { dg-warning "exceeds maximum object size" } */
|
||||
|
||||
n = __SIZE_MAX__;
|
||||
T (__builtin_malloc (n)); /* { dg-warning "exceeds maximum object size" } */
|
||||
}
|
||||
|
||||
/* { dg-warning "invalid argument .1zb. to .-Walloc-size-larger-than=." "" { target *-*-* } 0 } */
|
27
gcc/testsuite/gcc.dg/Walloc-size-larger-than-17.c
Normal file
27
gcc/testsuite/gcc.dg/Walloc-size-larger-than-17.c
Normal file
|
@ -0,0 +1,27 @@
|
|||
/* PR middle-end/82063 - issues with arguments enabled by -Wall
|
||||
{ dg-do compile }
|
||||
{ dg-options "-O -Wno-alloc-size-larger-than -ftrack-macro-expansion=0" } */
|
||||
|
||||
typedef __SIZE_TYPE__ size_t;
|
||||
|
||||
void sink (void*);
|
||||
|
||||
#define T(x) sink (x)
|
||||
|
||||
void f (void)
|
||||
{
|
||||
size_t n = 0;
|
||||
T (__builtin_malloc (n));
|
||||
|
||||
n = __PTRDIFF_MAX__;
|
||||
T (__builtin_malloc (n));
|
||||
|
||||
n += 1;
|
||||
T (__builtin_malloc (n));
|
||||
|
||||
n = __SIZE_MAX__ - 1;
|
||||
T (__builtin_malloc (n));
|
||||
|
||||
n = __SIZE_MAX__;
|
||||
T (__builtin_malloc (n));
|
||||
}
|
20
gcc/testsuite/gcc.dg/Walloc-size-larger-than-2.c
Normal file
20
gcc/testsuite/gcc.dg/Walloc-size-larger-than-2.c
Normal file
|
@ -0,0 +1,20 @@
|
|||
/* PR middle-end/82063 - issues with arguments enabled by -Wall
|
||||
{ dg-do compile }
|
||||
{ dg-options "-O -Walloc-size-larger-than=1KiB -ftrack-macro-expansion=0" }
|
||||
*/
|
||||
|
||||
void sink (void*);
|
||||
|
||||
#define T(x) sink (x)
|
||||
|
||||
void f (void)
|
||||
{
|
||||
unsigned n = 0;
|
||||
T (__builtin_malloc (n));
|
||||
|
||||
n = 1024; /* 1 kibibyte (KB or KiB) */
|
||||
T (__builtin_malloc (n));
|
||||
|
||||
n = 1025;
|
||||
T (__builtin_malloc (n)); /* { dg-warning "argument 1 value .1025. exceeds maximum object size 1024" } */
|
||||
}
|
19
gcc/testsuite/gcc.dg/Walloc-size-larger-than-3.c
Normal file
19
gcc/testsuite/gcc.dg/Walloc-size-larger-than-3.c
Normal file
|
@ -0,0 +1,19 @@
|
|||
/* PR middle-end/82063 - issues with arguments enabled by -Wall
|
||||
{ dg-do compile }
|
||||
{ dg-options "-O -Walloc-size-larger-than=1kB -ftrack-macro-expansion=0" } */
|
||||
|
||||
void sink (void*);
|
||||
|
||||
#define T(x) sink (x)
|
||||
|
||||
void f (void)
|
||||
{
|
||||
unsigned n = 0;
|
||||
T (__builtin_malloc (n));
|
||||
|
||||
n = 1000; /* 1 kilobyte (kB, not to be confused with KB or KiB) */
|
||||
T (__builtin_malloc (n));
|
||||
|
||||
n = 1001;
|
||||
T (__builtin_malloc (n)); /* { dg-warning "argument 1 value .1001. exceeds maximum object size 1000" } */
|
||||
}
|
19
gcc/testsuite/gcc.dg/Walloc-size-larger-than-4.c
Normal file
19
gcc/testsuite/gcc.dg/Walloc-size-larger-than-4.c
Normal file
|
@ -0,0 +1,19 @@
|
|||
/* PR middle-end/82063 - issues with arguments enabled by -Wall
|
||||
{ dg-do compile }
|
||||
{ dg-options "-O -Walloc-size-larger-than=1MiB -ftrack-macro-expansion=0" } */
|
||||
|
||||
void sink (void*);
|
||||
|
||||
#define T(x) sink (x)
|
||||
|
||||
void f (void)
|
||||
{
|
||||
unsigned n = 0;
|
||||
T (__builtin_malloc (n));
|
||||
|
||||
n = 1024 * 1024; /* 1 mebibyte (MiB) */
|
||||
T (__builtin_malloc (n));
|
||||
|
||||
n += 1;
|
||||
T (__builtin_malloc (n)); /* { dg-warning "argument 1 value .1048577. exceeds maximum object size 1048576" } */
|
||||
}
|
25
gcc/testsuite/gcc.dg/Walloc-size-larger-than-5.c
Normal file
25
gcc/testsuite/gcc.dg/Walloc-size-larger-than-5.c
Normal file
|
@ -0,0 +1,25 @@
|
|||
/* PR middle-end/82063 - issues with arguments enabled by -Wall
|
||||
{ dg-do compile }
|
||||
{ dg-options "-O -Walloc-size-larger-than=1MB -ftrack-macro-expansion=0" } */
|
||||
|
||||
void sink (void*);
|
||||
|
||||
#define T(x) sink (x)
|
||||
|
||||
void f (void)
|
||||
{
|
||||
__SIZE_TYPE__ n = 0;
|
||||
T (__builtin_malloc (n));
|
||||
|
||||
n = 1000 * 1000; /* 1 megabyte (MB) */
|
||||
T (__builtin_malloc (n));
|
||||
|
||||
n += 1;
|
||||
T (__builtin_malloc (n)); /* { dg-warning "argument 1 value .1000001. exceeds maximum object size 1000000" } */
|
||||
|
||||
n = __PTRDIFF_MAX__;
|
||||
T (__builtin_malloc (n)); /* { dg-warning "exceeds maximum object size 1000000" } */
|
||||
|
||||
n = __SIZE_MAX__;
|
||||
T (__builtin_malloc (n)); /* { dg-warning "exceeds maximum object size 1000000" } */
|
||||
}
|
25
gcc/testsuite/gcc.dg/Walloc-size-larger-than-6.c
Normal file
25
gcc/testsuite/gcc.dg/Walloc-size-larger-than-6.c
Normal file
|
@ -0,0 +1,25 @@
|
|||
/* PR middle-end/82063 - issues with arguments enabled by -Wall
|
||||
{ dg-do compile }
|
||||
{ dg-options "-O -Walloc-size-larger-than=1GiB -ftrack-macro-expansion=0" } */
|
||||
|
||||
void sink (void*);
|
||||
|
||||
#define T(x) sink (x)
|
||||
|
||||
void f (void)
|
||||
{
|
||||
__SIZE_TYPE__ n = 0;
|
||||
T (__builtin_malloc (n));
|
||||
|
||||
n = 1024 * 1024 * 1024; /* 1 gigibyte (GiB) */
|
||||
T (__builtin_malloc (n));
|
||||
|
||||
n += 1;
|
||||
T (__builtin_malloc (n)); /* { dg-warning "argument 1 value .1073741825. exceeds maximum object size 1073741824" } */
|
||||
|
||||
n = __PTRDIFF_MAX__;
|
||||
T (__builtin_malloc (n)); /* { dg-warning "exceeds maximum object size" } */
|
||||
|
||||
n = __SIZE_MAX__;
|
||||
T (__builtin_malloc (n)); /* { dg-warning "exceeds maximum object size" } */
|
||||
}
|
25
gcc/testsuite/gcc.dg/Walloc-size-larger-than-7.c
Normal file
25
gcc/testsuite/gcc.dg/Walloc-size-larger-than-7.c
Normal file
|
@ -0,0 +1,25 @@
|
|||
/* PR middle-end/82063 - issues with arguments enabled by -Wall
|
||||
{ dg-do compile }
|
||||
{ dg-options "-O -Walloc-size-larger-than=1GB -ftrack-macro-expansion=0" } */
|
||||
|
||||
void sink (void*);
|
||||
|
||||
#define T(x) sink (x)
|
||||
|
||||
void f (void)
|
||||
{
|
||||
__SIZE_TYPE__ n = 0;
|
||||
T (__builtin_malloc (n));
|
||||
|
||||
n = 1000 * 1000 * 1000; /* 1 gigabyte (GB) */
|
||||
T (__builtin_malloc (n));
|
||||
|
||||
n += 1;
|
||||
T (__builtin_malloc (n)); /* { dg-warning "argument 1 value .1000000001. exceeds maximum object size 1000000000" } */
|
||||
|
||||
n = __PTRDIFF_MAX__;
|
||||
T (__builtin_malloc (n)); /* { dg-warning "exceeds maximum object size" } */
|
||||
|
||||
n = __SIZE_MAX__;
|
||||
T (__builtin_malloc (n)); /* { dg-warning "exceeds maximum object size" } */
|
||||
}
|
27
gcc/testsuite/gcc.dg/Walloc-size-larger-than-8.c
Normal file
27
gcc/testsuite/gcc.dg/Walloc-size-larger-than-8.c
Normal file
|
@ -0,0 +1,27 @@
|
|||
/* PR middle-end/82063 - issues with arguments enabled by -Wall
|
||||
{ dg-do compile { target lp64 } }
|
||||
{ dg-options "-O -Walloc-size-larger-than=1TiB -ftrack-macro-expansion=0" } */
|
||||
|
||||
typedef __SIZE_TYPE__ size_t;
|
||||
|
||||
void sink (void*);
|
||||
|
||||
#define T(x) sink (x)
|
||||
|
||||
void f (void)
|
||||
{
|
||||
size_t n = 0;
|
||||
T (__builtin_malloc (n));
|
||||
|
||||
n = (size_t)1024 * 1024 * 1024 * 1024; /* 1 tebibyte (TiB) */
|
||||
T (__builtin_malloc (n));
|
||||
|
||||
n += 1;
|
||||
T (__builtin_malloc (n)); /* { dg-warning "argument 1 value .1099511627777. exceeds maximum object size 1099511627776" } */
|
||||
|
||||
n = __PTRDIFF_MAX__;
|
||||
T (__builtin_malloc (n)); /* { dg-warning "exceeds maximum object size" } */
|
||||
|
||||
n = __SIZE_MAX__;
|
||||
T (__builtin_malloc (n)); /* { dg-warning "exceeds maximum object size" } */
|
||||
}
|
27
gcc/testsuite/gcc.dg/Walloc-size-larger-than-9.c
Normal file
27
gcc/testsuite/gcc.dg/Walloc-size-larger-than-9.c
Normal file
|
@ -0,0 +1,27 @@
|
|||
/* PR middle-end/82063 - issues with arguments enabled by -Wall
|
||||
{ dg-do compile { target lp64 } }
|
||||
{ dg-options "-O -Walloc-size-larger-than=1TB -ftrack-macro-expansion=0" } */
|
||||
|
||||
typedef __SIZE_TYPE__ size_t;
|
||||
|
||||
void sink (void*);
|
||||
|
||||
#define T(x) sink (x)
|
||||
|
||||
void f (void)
|
||||
{
|
||||
size_t n = 0;
|
||||
T (__builtin_malloc (n));
|
||||
|
||||
n = (size_t)1000 * 1000 * 1000 * 1000; /* 1 terabyte (TB) */
|
||||
T (__builtin_malloc (n));
|
||||
|
||||
n += 1;
|
||||
T (__builtin_malloc (n)); /* { dg-warning "argument 1 value .1000000000001. exceeds maximum object size 1000000000000" } */
|
||||
|
||||
n = __PTRDIFF_MAX__;
|
||||
T (__builtin_malloc (n)); /* { dg-warning "exceeds maximum object size" } */
|
||||
|
||||
n = __SIZE_MAX__;
|
||||
T (__builtin_malloc (n)); /* { dg-warning "exceeds maximum object size" } */
|
||||
}
|
13
gcc/testsuite/gcc.dg/Walloc-size-larger-than.c
Normal file
13
gcc/testsuite/gcc.dg/Walloc-size-larger-than.c
Normal file
|
@ -0,0 +1,13 @@
|
|||
/* PR middle-end/82063 - issues with arguments enabled by -Wall
|
||||
{ dg-do compile }
|
||||
{ dg-options "-Walloc-size-larger-than=0 -ftrack-macro-expansion=0" } */
|
||||
|
||||
void sink (void*);
|
||||
|
||||
#define T(x) sink (x)
|
||||
|
||||
void f (void)
|
||||
{
|
||||
T (__builtin_malloc (0));
|
||||
T (__builtin_malloc (1)); /* { dg-warning "argument 1 value .1. exceeds maximum object size 0" } */
|
||||
}
|
Loading…
Add table
Reference in a new issue