]> granicus.if.org Git - clang/commitdiff
[Sema] Detect more array index out of bounds when C++ overloaded operators are used
authorDaniel Marjamaki <daniel.marjamaki@evidente.se>
Tue, 28 Feb 2017 14:53:50 +0000 (14:53 +0000)
committerDaniel Marjamaki <daniel.marjamaki@evidente.se>
Tue, 28 Feb 2017 14:53:50 +0000 (14:53 +0000)
Differential Revision: https://reviews.llvm.org/D30192

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@296477 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Sema/SemaChecking.cpp
test/SemaCXX/array-bounds.cpp

index 912b52b88b8c72f0f171f0cc4aa6921499597bde..eef8f557744cbe7935130fb14df6ac9f5cd4d8be 100644 (file)
@@ -10609,6 +10609,12 @@ void Sema::CheckArrayAccess(const Expr *expr) {
           CheckArrayAccess(rhs);
         return;
       }
+      case Stmt::CXXOperatorCallExprClass: {
+        const auto *OCE = cast<CXXOperatorCallExpr>(expr);
+        for (const auto *Arg : OCE->arguments())
+          CheckArrayAccess(Arg);
+        return;
+      }
       default:
         return;
     }
index 80b3ee4289445d969d0afa15586d49cdd39a4263..8ae92e76130101d3011042fad4c90273597f5235 100644 (file)
@@ -1,4 +1,4 @@
-// RUN: %clang_cc1 -verify %s
+// RUN: %clang_cc1 -verify -std=c++11 %s
 
 int foo() {
   int x[2]; // expected-note 4 {{array 'x' declared here}}
@@ -253,3 +253,19 @@ void test_rdar10916006(void)
        int a[128]; // expected-note {{array 'a' declared here}}
        a[(unsigned char)'\xA1'] = 1; // expected-warning {{array index 161 is past the end of the array}}
 }
+
+struct P {
+  int a;
+  int b;
+};
+
+void test_struct_array_index() {
+  struct P p[10]; // expected-note {{array 'p' declared here}}
+  p[11] = {0, 1}; // expected-warning {{array index 11 is past the end of the array (which contains 10 elements)}}
+}
+
+int operator+(const struct P &s1, const struct P &s2);
+int test_operator_overload_struct_array_index() {
+  struct P x[10] = {0}; // expected-note {{array 'x' declared here}}
+  return x[1] + x[11]; // expected-warning {{array index 11 is past the end of the array (which contains 10 elements)}}
+}