Hi jordan_rose,

Hi All,
Out of bound access of array of structures/unions are not reported. Added a 
patch to handle the same.
Please let me know if it is good to commit.
Thanks
Karthik Bhat

http://llvm-reviews.chandlerc.com/D1580

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

Index: lib/Sema/SemaChecking.cpp
===================================================================
--- lib/Sema/SemaChecking.cpp
+++ lib/Sema/SemaChecking.cpp
@@ -6373,6 +6373,12 @@
           CheckArrayAccess(rhs);
         return;
       }
+      case Stmt::MemberExprClass: {
+        const MemberExpr *memExpr = cast<MemberExpr>(expr);
+        if (const Expr *base = memExpr->getBase())
+          CheckArrayAccess(base);
+        return;
+      }
       default:
         return;
     }
Index: test/SemaCXX/array-bounds.cpp
===================================================================
--- test/SemaCXX/array-bounds.cpp
+++ test/SemaCXX/array-bounds.cpp
@@ -253,3 +253,20 @@
        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}}
 }
+
+typedef struct {
+    int a;
+} structTest;
+
+void
+test_arraystructOverflow() {
+  structTest data[2];  // expected-note 2 {{array 'data' declared here}}
+  if (!data[1].a && !data[2].a) {  // expected-warning {{array index 2 is past 
the end of the array (which contains 2 elements)}}
+    data[2].a = 1;  // expected-warning {{array index 2 is past the end of the 
array (which contains 2 elements)}}
+  }
+  return;
+}
+
+
+
+
Index: lib/Sema/SemaChecking.cpp
===================================================================
--- lib/Sema/SemaChecking.cpp
+++ lib/Sema/SemaChecking.cpp
@@ -6373,6 +6373,12 @@
           CheckArrayAccess(rhs);
         return;
       }
+      case Stmt::MemberExprClass: {
+        const MemberExpr *memExpr = cast<MemberExpr>(expr);
+        if (const Expr *base = memExpr->getBase())
+          CheckArrayAccess(base);
+        return;
+      }
       default:
         return;
     }
Index: test/SemaCXX/array-bounds.cpp
===================================================================
--- test/SemaCXX/array-bounds.cpp
+++ test/SemaCXX/array-bounds.cpp
@@ -253,3 +253,20 @@
 	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}}
 }
+
+typedef struct {
+    int a;
+} structTest;
+
+void
+test_arraystructOverflow() {
+  structTest data[2];  // expected-note 2 {{array 'data' declared here}}
+  if (!data[1].a && !data[2].a) {  // expected-warning {{array index 2 is past the end of the array (which contains 2 elements)}}
+    data[2].a = 1;  // expected-warning {{array index 2 is past the end of the array (which contains 2 elements)}}
+  }
+  return;
+}
+
+
+
+
_______________________________________________
cfe-commits mailing list
[email protected]
http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits

Reply via email to