diff options
author | Chandler Carruth <chandlerc@gmail.com> | 2011-02-17 21:10:52 +0000 |
---|---|---|
committer | Chandler Carruth <chandlerc@gmail.com> | 2011-02-17 21:10:52 +0000 |
commit | 35001ca261f895817916b468379b696d6d45959d (patch) | |
tree | 130607f44e2ce2e292d55c6495012bce9567e72c /test/SemaCXX/array-bounds.cpp | |
parent | 3406458512c3cdfe2076c46b9aedb4621297efd5 (diff) |
Enhance the array bounds checking to work for several other constructs,
especially C++ code, and generally expand the test coverage.
Logic adapted from a patch by Kaelyn Uhrain <rikka@google.com> and
another Googler.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@125775 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'test/SemaCXX/array-bounds.cpp')
-rw-r--r-- | test/SemaCXX/array-bounds.cpp | 69 |
1 files changed, 62 insertions, 7 deletions
diff --git a/test/SemaCXX/array-bounds.cpp b/test/SemaCXX/array-bounds.cpp index d60600fd4b..94973762a1 100644 --- a/test/SemaCXX/array-bounds.cpp +++ b/test/SemaCXX/array-bounds.cpp @@ -5,17 +5,72 @@ int foo() { int y[2]; // expected-note 2 {{array 'y' declared here}} int *p = &y[2]; // no-warning (void) sizeof(x[2]); // no-warning - y[2] = 2; // expected-warning{{array index of '2' indexes past the end of an array (that contains 2 elements)}} - return x[2] + // expected-warning{{array index of '2' indexes past the end of an array (that contains 2 elements)}} - y[-1] + // expected-warning{{array index of '-1' indexes before the beginning of the array}} - x[sizeof(x)] + // expected-warning{{array index of '8' indexes past the end of an array (that contains 2 elements)}} - x[sizeof(x) / sizeof(x[0])] + // expected-warning{{array index of '2' indexes past the end of an array (that contains 2 elements)}} + y[2] = 2; // expected-warning {{array index of '2' indexes past the end of an array (that contains 2 elements)}} + return x[2] + // expected-warning {{array index of '2' indexes past the end of an array (that contains 2 elements)}} + y[-1] + // expected-warning {{array index of '-1' indexes before the beginning of the array}} + x[sizeof(x)] + // expected-warning {{array index of '8' indexes past the end of an array (that contains 2 elements)}} + x[sizeof(x) / sizeof(x[0])] + // expected-warning {{array index of '2' indexes past the end of an array (that contains 2 elements)}} x[sizeof(x) / sizeof(x[0]) - 1] + // no-warning - x[sizeof(x[2])]; // expected-warning{{array index of '4' indexes past the end of an array (that contains 2 elements)}} + x[sizeof(x[2])]; // expected-warning {{array index of '4' indexes past the end of an array (that contains 2 elements)}} } // This code example tests that -Warray-bounds works with arrays that // are template parameters. template <char *sz> class Qux { bool test() { return sz[0] == 'a'; } -};
\ No newline at end of file +}; + +void f1(int a[1]) { + int val = a[3]; // no warning for function argumnet +} + +void f2(const int (&a)[1]) { // expected-note {{declared here}} + int val = a[3]; // expected-warning {{array index of '3' indexes past the end of an array (that contains 1 elements)}} +} + +void test() { + struct { + int a[0]; + } s2; + s2.a[3] = 0; // no warning for 0-sized array + + union { + short a[2]; // expected-note {{declared here}} + char c[4]; + } u; + u.a[3] = 1; // expected-warning {{array index of '3' indexes past the end of an array (that contains 2 elements)}} + u.c[3] = 1; // no warning + + const int const_subscript = 3; + int array[1]; // expected-note {{declared here}} + array[const_subscript] = 0; // expected-warning {{array index of '3' indexes past the end of an array (that contains 1 elements)}} + + int *ptr; + ptr[3] = 0; // no warning for pointer references + int array2[] = { 0, 1, 2 }; // expected-note 2 {{declared here}} + + array2[3] = 0; // expected-warning {{array index of '3' indexes past the end of an array (that contains 3 elements)}} + array2[2+2] = 0; // expected-warning {{array index of '4' indexes past the end of an array (that contains 3 elements)}} + + const char *str1 = "foo"; + char c1 = str1[5]; // no warning for pointers + + const char str2[] = "foo"; // expected-note {{declared here}} + char c2 = str2[5]; // expected-warning {{array index of '5' indexes past the end of an array (that contains 4 elements)}} + + int (*array_ptr)[1]; + (*array_ptr)[3] = 1; // expected-warning {{array index of '3' indexes past the end of an array (that contains 1 elements)}} +} + +template <int I> struct S { + char arr[I]; // expected-note 3 {{declared here}} +}; +template <int I> void f() { + S<3> s; + s.arr[4] = 0; // expected-warning 2 {{array index of '4' indexes past the end of an array (that contains 3 elements)}} + s.arr[I] = 0; // expected-warning {{array index of '5' indexes past the end of an array (that contains 3 elements)}} +} + +void test_templates() { + f<5>(); // expected-note {{in instantiation}} +} |