diff options
author | Martin Sebor <msebor@redhat.com> | 2020-10-12 09:35:02 -0600 |
---|---|---|
committer | Martin Sebor <msebor@redhat.com> | 2020-10-12 09:36:26 -0600 |
commit | 1be51a3a9ac3409561223c8058d4943f9b574d15 (patch) | |
tree | e332d3ec5e66c8e0c51b13b551a8e7fa182eafb2 /gcc/testsuite | |
parent | 83685efd5fd1623cfc4e4c435ce2773d95d458d1 (diff) | |
download | gcc-1be51a3a9ac3409561223c8058d4943f9b574d15.zip gcc-1be51a3a9ac3409561223c8058d4943f9b574d15.tar.gz gcc-1be51a3a9ac3409561223c8058d4943f9b574d15.tar.bz2 |
PR c++/97201 - ICE in -Warray-bounds writing to result of operator new(0)
gcc/cp/ChangeLog:
PR c++/97201
* error.c (dump_type_suffix): Handle both the C and C++ forms of
zero-length arrays.
libstdc++-v3/ChangeLog:
PR c++/97201
* libsupc++/new (operator new): Add attribute alloc_size and malloc.
gcc/testsuite/ChangeLog:
PR c++/97201
* g++.dg/warn/Wplacement-new-size-8.C: Adjust expected message.
* g++.dg/warn/Warray-bounds-10.C: New test.
* g++.dg/warn/Warray-bounds-11.C: New test.
* g++.dg/warn/Warray-bounds-12.C: New test.
* g++.dg/warn/Warray-bounds-13.C: New test.
Diffstat (limited to 'gcc/testsuite')
-rw-r--r-- | gcc/testsuite/g++.dg/warn/Warray-bounds-10.C | 64 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/warn/Warray-bounds-11.C | 66 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/warn/Warray-bounds-12.C | 66 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/warn/Warray-bounds-13.C | 70 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/warn/Wplacement-new-size-8.C | 2 |
5 files changed, 267 insertions, 1 deletions
diff --git a/gcc/testsuite/g++.dg/warn/Warray-bounds-10.C b/gcc/testsuite/g++.dg/warn/Warray-bounds-10.C new file mode 100644 index 0000000..2246697 --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/Warray-bounds-10.C @@ -0,0 +1,64 @@ +/* PR c++/97201 - ICE in -Warray-bounds writing to result of operator new(0) + Verify that out-of-bounds accesses to memory returned by default operator + new() are diagnosed. + { dg-do compile } + { dg-options "-O2 -Wall -Warray-bounds -ftrack-macro-expansion=0" } */ + +typedef __INT32_TYPE__ int32_t; + +void sink (void*); + +#define OP_NEW(n) operator new (n) +#define T(T, n, i) do { \ + T *p = (T*) OP_NEW (n); \ + p[i] = 0; \ + sink (p); \ + } while (0) + +void warn_op_new () +{ + T (int32_t, 0, 0); // { dg-warning "array subscript 0 is outside array bounds of 'int32_t \\\[0]'" } + // { dg-message "referencing an object of size \\d allocated by 'void\\\* operator new\\\(\(long \)?unsigned int\\\)'" "note" { target *-*-* } .-1 } + T (int32_t, 1, 0); // { dg-warning "array subscript 'int32_t {aka int}\\\[0]' is partly outside array bounds of 'unsigned char \\\[1]'" } + T (int32_t, 2, 0); // { dg-warning "array subscript 'int32_t {aka int}\\\[0]' is partly outside array bounds of 'unsigned char \\\[2]'" } + T (int32_t, 3, 0); // { dg-warning "array subscript 'int32_t {aka int}\\\[0]' is partly outside array bounds of 'unsigned char \\\[3]'" } + + T (int32_t, 4, 0); + + T (int32_t, 0, 1); // { dg-warning "array subscript 1 is outside array bounds of 'int32_t \\\[0]'" } + T (int32_t, 1, 1); // { dg-warning "array subscript 1 is outside array bounds " } + T (int32_t, 2, 1); // { dg-warning "array subscript 1 is outside array bounds " } + T (int32_t, 3, 1); // { dg-warning "array subscript 1 is outside array bounds " } + T (int32_t, 4, 1); // { dg-warning "array subscript 1 is outside array bounds " } + T (int32_t, 5, 1); // { dg-warning "array subscript 'int32_t {aka int}\\\[1]' is partly outside array bounds of 'unsigned char \\\[5]" } + T (int32_t, 6, 1); // { dg-warning "array subscript 'int32_t {aka int}\\\[1]' is partly outside array bounds of 'unsigned char \\\[6]" } + T (int32_t, 7, 1); // { dg-warning "array subscript 'int32_t {aka int}\\\[1]' is partly outside array bounds of 'unsigned char \\\[7]" } + + T (int32_t, 8, 1); +} + + +void warn_op_array_new () +{ +#undef OP_NEW +#define OP_NEW(n) operator new[] (n) + + T (int32_t, 0, 0); // { dg-warning "array subscript 0 is outside array bounds of 'int32_t \\\[0]'" } + // { dg-message "referencing an object of size \\d allocated by 'void\\\* operator new \\\[]\\\(\(long \)?unsigned int\\\)'" "note" { target *-*-* } .-1 } + T (int32_t, 1, 0); // { dg-warning "array subscript 'int32_t {aka int}\\\[0]' is partly outside array bounds of 'unsigned char \\\[1]'" } + T (int32_t, 2, 0); // { dg-warning "array subscript 'int32_t {aka int}\\\[0]' is partly outside array bounds of 'unsigned char \\\[2]'" } + T (int32_t, 3, 0); // { dg-warning "array subscript 'int32_t {aka int}\\\[0]' is partly outside array bounds of 'unsigned char \\\[3]'" } + + T (int32_t, 4, 0); + + T (int32_t, 0, 1); // { dg-warning "array subscript 1 is outside array bounds of 'int32_t \\\[0]'" } + T (int32_t, 1, 1); // { dg-warning "array subscript 1 is outside array bounds " } + T (int32_t, 2, 1); // { dg-warning "array subscript 1 is outside array bounds " } + T (int32_t, 3, 1); // { dg-warning "array subscript 1 is outside array bounds " } + T (int32_t, 4, 1); // { dg-warning "array subscript 1 is outside array bounds " } + T (int32_t, 5, 1); // { dg-warning "array subscript 'int32_t {aka int}\\\[1]' is partly outside array bounds of 'unsigned char \\\[5]" } + T (int32_t, 6, 1); // { dg-warning "array subscript 'int32_t {aka int}\\\[1]' is partly outside array bounds of 'unsigned char \\\[6]" } + T (int32_t, 7, 1); // { dg-warning "array subscript 'int32_t {aka int}\\\[1]' is partly outside array bounds of 'unsigned char \\\[7]" } + + T (int32_t, 8, 1); +} diff --git a/gcc/testsuite/g++.dg/warn/Warray-bounds-11.C b/gcc/testsuite/g++.dg/warn/Warray-bounds-11.C new file mode 100644 index 0000000..9875e29 --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/Warray-bounds-11.C @@ -0,0 +1,66 @@ +/* PR c++/97201 - ICE in -Warray-bounds writing to result of operator new(0) + Verify that out-of-bounds accesses to memory returned by nothrow operator + new() are diagnosed. + { dg-do compile } + { dg-options "-O2 -Wall -Warray-bounds -ftrack-macro-expansion=0" } */ + +#include <new> + +typedef __INT32_TYPE__ int32_t; + +void sink (void*); + +#define OP_NEW(n) operator new (n, std::nothrow) +#define T(T, n, i) do { \ + T *p = (T*) OP_NEW (n); \ + p[i] = 0; \ + sink (p); \ + } while (0) + +void warn_op_new () +{ + T (int32_t, 0, 0); // { dg-warning "array subscript 0 is outside array bounds of 'int32_t \\\[0]'" } + // { dg-message "referencing an object of size \\d allocated by 'void\\\* operator new\\\(std::size_t, const std::nothrow_t.\\\)'" "note" { target *-*-* } .-1 } + T (int32_t, 1, 0); // { dg-warning "array subscript 'int32_t {aka int}\\\[0]' is partly outside array bounds of 'unsigned char \\\[1]'" } + T (int32_t, 2, 0); // { dg-warning "array subscript 'int32_t {aka int}\\\[0]' is partly outside array bounds of 'unsigned char \\\[2]'" } + T (int32_t, 3, 0); // { dg-warning "array subscript 'int32_t {aka int}\\\[0]' is partly outside array bounds of 'unsigned char \\\[3]'" } + + T (int32_t, 4, 0); + + T (int32_t, 0, 1); // { dg-warning "array subscript 1 is outside array bounds of 'int32_t \\\[0]'" } + T (int32_t, 1, 1); // { dg-warning "array subscript 1 is outside array bounds " } + T (int32_t, 2, 1); // { dg-warning "array subscript 1 is outside array bounds " } + T (int32_t, 3, 1); // { dg-warning "array subscript 1 is outside array bounds " } + T (int32_t, 4, 1); // { dg-warning "array subscript 1 is outside array bounds " } + T (int32_t, 5, 1); // { dg-warning "array subscript 'int32_t {aka int}\\\[1]' is partly outside array bounds of 'unsigned char \\\[5]" } + T (int32_t, 6, 1); // { dg-warning "array subscript 'int32_t {aka int}\\\[1]' is partly outside array bounds of 'unsigned char \\\[6]" } + T (int32_t, 7, 1); // { dg-warning "array subscript 'int32_t {aka int}\\\[1]' is partly outside array bounds of 'unsigned char \\\[7]" } + + T (int32_t, 8, 1); +} + + +void warn_op_array_new () +{ +#undef OP_NEW +#define OP_NEW(n) operator new[] (n, std::nothrow) + + T (int32_t, 0, 0); // { dg-warning "array subscript 0 is outside array bounds of 'int32_t \\\[0]'" } + // { dg-message "referencing an object of size \\d allocated by 'void\\\* operator new \\\[]\\\(std::size_t, const std::nothrow_t&\\\)'" "note" { target *-*-* } .-1 } + T (int32_t, 1, 0); // { dg-warning "array subscript 'int32_t {aka int}\\\[0]' is partly outside array bounds of 'unsigned char \\\[1]'" } + T (int32_t, 2, 0); // { dg-warning "array subscript 'int32_t {aka int}\\\[0]' is partly outside array bounds of 'unsigned char \\\[2]'" } + T (int32_t, 3, 0); // { dg-warning "array subscript 'int32_t {aka int}\\\[0]' is partly outside array bounds of 'unsigned char \\\[3]'" } + + T (int32_t, 4, 0); + + T (int32_t, 0, 1); // { dg-warning "array subscript 1 is outside array bounds of 'int32_t \\\[0]'" } + T (int32_t, 1, 1); // { dg-warning "array subscript 1 is outside array bounds " } + T (int32_t, 2, 1); // { dg-warning "array subscript 1 is outside array bounds " } + T (int32_t, 3, 1); // { dg-warning "array subscript 1 is outside array bounds " } + T (int32_t, 4, 1); // { dg-warning "array subscript 1 is outside array bounds " } + T (int32_t, 5, 1); // { dg-warning "array subscript 'int32_t {aka int}\\\[1]' is partly outside array bounds of 'unsigned char \\\[5]" } + T (int32_t, 6, 1); // { dg-warning "array subscript 'int32_t {aka int}\\\[1]' is partly outside array bounds of 'unsigned char \\\[6]" } + T (int32_t, 7, 1); // { dg-warning "array subscript 'int32_t {aka int}\\\[1]' is partly outside array bounds of 'unsigned char \\\[7]" } + + T (int32_t, 8, 1); +} diff --git a/gcc/testsuite/g++.dg/warn/Warray-bounds-12.C b/gcc/testsuite/g++.dg/warn/Warray-bounds-12.C new file mode 100644 index 0000000..9e8b604 --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/Warray-bounds-12.C @@ -0,0 +1,66 @@ +/* PR c++/97201 - ICE in -Warray-bounds writing to result of operator new(0) + Verify that out-of-bounds accesses to memory returned by the new expression + are diagnosed. + { dg-do compile } + { dg-options "-O2 -Wall -Warray-bounds -ftrack-macro-expansion=0" } */ + +typedef __INT32_TYPE__ int32_t; + +template <int N> struct S { char a[N]; }; + +void sink (void*); + +#define NEW(n) new S<n> +#define T(T, n, i) do { \ + T *p = (T*)NEW (n); \ + p[i] = 0; \ + sink (p); \ + } while (0) + +void warn_new () +{ + T (int32_t, 0, 0); // { dg-warning "array subscript 0 is outside array bounds of 'int32_t \\\[0]'" } + // { dg-message "referencing an object of size \\d allocated by 'void\\\* operator new\\\(\(long \)?unsigned int\\\)'" "note" { target *-*-* } .-1 } + T (int32_t, 1, 0); // { dg-warning "array subscript 'int32_t {aka int}\\\[0]' is partly outside array bounds of 'unsigned char \\\[1]'" } + T (int32_t, 2, 0); // { dg-warning "array subscript 'int32_t {aka int}\\\[0]' is partly outside array bounds of 'unsigned char \\\[2]'" } + T (int32_t, 3, 0); // { dg-warning "array subscript 'int32_t {aka int}\\\[0]' is partly outside array bounds of 'unsigned char \\\[3]'" } + + T (int32_t, 4, 0); + + T (int32_t, 0, 1); // { dg-warning "array subscript 1 is outside array bounds of 'int32_t \\\[0]'" } + T (int32_t, 1, 1); // { dg-warning "array subscript 1 is outside array bounds " } + T (int32_t, 2, 1); // { dg-warning "array subscript 1 is outside array bounds " } + T (int32_t, 3, 1); // { dg-warning "array subscript 1 is outside array bounds " } + T (int32_t, 4, 1); // { dg-warning "array subscript 1 is outside array bounds " } + T (int32_t, 5, 1); // { dg-warning "array subscript 'int32_t {aka int}\\\[1]' is partly outside array bounds of 'unsigned char \\\[5]" } + T (int32_t, 6, 1); // { dg-warning "array subscript 'int32_t {aka int}\\\[1]' is partly outside array bounds of 'unsigned char \\\[6]" } + T (int32_t, 7, 1); // { dg-warning "array subscript 'int32_t {aka int}\\\[1]' is partly outside array bounds of 'unsigned char \\\[7]" } + + T (int32_t, 8, 1); +} + + +void warn_array_new () +{ +#undef NEW +#define NEW(n) new char [n] + + T (int32_t, 0, 0); // { dg-warning "array subscript 0 is outside array bounds of 'int32_t \\\[0]'" } + // { dg-message "referencing an object of size \\d allocated by 'void\\\* operator new \\\[]\\\(\(long \)?unsigned int\\\)'" "note" { target *-*-* } .-1 } + T (int32_t, 1, 0); // { dg-warning "array subscript 'int32_t {aka int}\\\[0]' is partly outside array bounds of 'unsigned char \\\[1]'" } + T (int32_t, 2, 0); // { dg-warning "array subscript 'int32_t {aka int}\\\[0]' is partly outside array bounds of 'unsigned char \\\[2]'" } + T (int32_t, 3, 0); // { dg-warning "array subscript 'int32_t {aka int}\\\[0]' is partly outside array bounds of 'unsigned char \\\[3]'" } + + T (int32_t, 4, 0); + + T (int32_t, 0, 1); // { dg-warning "array subscript 1 is outside array bounds of 'int32_t \\\[0]'" } + T (int32_t, 1, 1); // { dg-warning "array subscript 1 is outside array bounds " } + T (int32_t, 2, 1); // { dg-warning "array subscript 1 is outside array bounds " } + T (int32_t, 3, 1); // { dg-warning "array subscript 1 is outside array bounds " } + T (int32_t, 4, 1); // { dg-warning "array subscript 1 is outside array bounds " } + T (int32_t, 5, 1); // { dg-warning "array subscript 'int32_t {aka int}\\\[1]' is partly outside array bounds of 'unsigned char \\\[5]" } + T (int32_t, 6, 1); // { dg-warning "array subscript 'int32_t {aka int}\\\[1]' is partly outside array bounds of 'unsigned char \\\[6]" } + T (int32_t, 7, 1); // { dg-warning "array subscript 'int32_t {aka int}\\\[1]' is partly outside array bounds of 'unsigned char \\\[7]" } + + T (int32_t, 8, 1); +} diff --git a/gcc/testsuite/g++.dg/warn/Warray-bounds-13.C b/gcc/testsuite/g++.dg/warn/Warray-bounds-13.C new file mode 100644 index 0000000..42fb809 --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/Warray-bounds-13.C @@ -0,0 +1,70 @@ +/* PR c++/97201 - ICE in -Warray-bounds writing to result of operator new(0) + Verify that out-of-bounds accesses to memory returned by the nothrow form + of the new expression are diagnosed. + { dg-do compile } + { dg-options "-O2 -Wall -Warray-bounds -ftrack-macro-expansion=0" } */ + +#include <new> + +typedef __INT32_TYPE__ int32_t; + +void sink (void*); + +template <int N> struct S { char a[N]; }; + +void sink (void*); + +#define NEW(n) new (std::nothrow) S<n> +#define T(T, n, i) do { \ + T *p = (T*)NEW (n); \ + p[i] = 0; \ + sink (p); \ + } while (0) + +void warn_nothrow_new () +{ + T (int32_t, 0, 0); // { dg-warning "array subscript 0 is outside array bounds of 'int32_t \\\[0]'" } + // { dg-message "referencing an object of size \\d allocated by 'void\\\* operator new\\\(std::size_t, const std::nothrow_t.\\\)'" "note" { target *-*-* } .-1 } + T (int32_t, 1, 0); // { dg-warning "array subscript 'int32_t {aka int}\\\[0]' is partly outside array bounds of 'unsigned char \\\[1]'" } + T (int32_t, 2, 0); // { dg-warning "array subscript 'int32_t {aka int}\\\[0]' is partly outside array bounds of 'unsigned char \\\[2]'" } + T (int32_t, 3, 0); // { dg-warning "array subscript 'int32_t {aka int}\\\[0]' is partly outside array bounds of 'unsigned char \\\[3]'" } + + T (int32_t, 4, 0); + + T (int32_t, 0, 1); // { dg-warning "array subscript 1 is outside array bounds of 'int32_t \\\[0]'" } + T (int32_t, 1, 1); // { dg-warning "array subscript 1 is outside array bounds " } + T (int32_t, 2, 1); // { dg-warning "array subscript 1 is outside array bounds " } + T (int32_t, 3, 1); // { dg-warning "array subscript 1 is outside array bounds " } + T (int32_t, 4, 1); // { dg-warning "array subscript 1 is outside array bounds " } + T (int32_t, 5, 1); // { dg-warning "array subscript 'int32_t {aka int}\\\[1]' is partly outside array bounds of 'unsigned char \\\[5]" } + T (int32_t, 6, 1); // { dg-warning "array subscript 'int32_t {aka int}\\\[1]' is partly outside array bounds of 'unsigned char \\\[6]" } + T (int32_t, 7, 1); // { dg-warning "array subscript 'int32_t {aka int}\\\[1]' is partly outside array bounds of 'unsigned char \\\[7]" } + + T (int32_t, 8, 1); +} + + +void warn_nothrow_array_new () +{ +#undef NEW +#define NEW(n) new (std::nothrow) char [n] + + T (int32_t, 0, 0); // { dg-warning "array subscript 0 is outside array bounds of 'int32_t \\\[0]'" } + // { dg-message "referencing an object of size \\d allocated by 'void\\\* operator new \\\[]\\\(std::size_t, const std::nothrow_t&\\\)'" "note" { target *-*-* } .-1 } + T (int32_t, 1, 0); // { dg-warning "array subscript 'int32_t {aka int}\\\[0]' is partly outside array bounds of 'unsigned char \\\[1]'" } + T (int32_t, 2, 0); // { dg-warning "array subscript 'int32_t {aka int}\\\[0]' is partly outside array bounds of 'unsigned char \\\[2]'" } + T (int32_t, 3, 0); // { dg-warning "array subscript 'int32_t {aka int}\\\[0]' is partly outside array bounds of 'unsigned char \\\[3]'" } + + T (int32_t, 4, 0); + + T (int32_t, 0, 1); // { dg-warning "array subscript 1 is outside array bounds of 'int32_t \\\[0]'" } + T (int32_t, 1, 1); // { dg-warning "array subscript 1 is outside array bounds " } + T (int32_t, 2, 1); // { dg-warning "array subscript 1 is outside array bounds " } + T (int32_t, 3, 1); // { dg-warning "array subscript 1 is outside array bounds " } + T (int32_t, 4, 1); // { dg-warning "array subscript 1 is outside array bounds " } + T (int32_t, 5, 1); // { dg-warning "array subscript 'int32_t {aka int}\\\[1]' is partly outside array bounds of 'unsigned char \\\[5]" } + T (int32_t, 6, 1); // { dg-warning "array subscript 'int32_t {aka int}\\\[1]' is partly outside array bounds of 'unsigned char \\\[6]" } + T (int32_t, 7, 1); // { dg-warning "array subscript 'int32_t {aka int}\\\[1]' is partly outside array bounds of 'unsigned char \\\[7]" } + + T (int32_t, 8, 1); +} diff --git a/gcc/testsuite/g++.dg/warn/Wplacement-new-size-8.C b/gcc/testsuite/g++.dg/warn/Wplacement-new-size-8.C index a0d1362..77bd331 100644 --- a/gcc/testsuite/g++.dg/warn/Wplacement-new-size-8.C +++ b/gcc/testsuite/g++.dg/warn/Wplacement-new-size-8.C @@ -138,7 +138,7 @@ void test_var_off_schar (signed char i) } { - char a[65281]; // { dg-message "at offset \\\[65153, 65408] from 'a'" } + char a[65281]; // { dg-message "at offset \\\[65153, 65281] from 'a'" "note" } new (a + i + 65280) S<1>; new (a + i + 65281) S<1>; new (a + i + 65281) S<128>; |