summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorVedant Kumar <vsk@apple.com>2016-10-04 20:36:04 +0000
committerVedant Kumar <vsk@apple.com>2016-10-04 20:36:04 +0000
commite356f1a50c0ef4311ab708dad4efc266cb1bc77c (patch)
tree3223d024084dca991949cce7ef65797a7c14a387
parentfedb9b67ca82babec0ed9aa68935d4474561f36b (diff)
downloadbcm5719-llvm-e356f1a50c0ef4311ab708dad4efc266cb1bc77c.tar.gz
bcm5719-llvm-e356f1a50c0ef4311ab708dad4efc266cb1bc77c.zip
[ubsan] Disable bounds-check for flexible array ivars
This eliminates a class of false positives for -fsanitize=array-bounds on instrumented ObjC projects. Differential Revision: https://reviews.llvm.org/D22227 llvm-svn: 283249
-rw-r--r--clang/lib/CodeGen/CGExpr.cpp2
-rw-r--r--clang/test/CodeGenObjC/ubsan-array-bounds.m59
2 files changed, 61 insertions, 0 deletions
diff --git a/clang/lib/CodeGen/CGExpr.cpp b/clang/lib/CodeGen/CGExpr.cpp
index 7e12f5e7358..94823ae91fd 100644
--- a/clang/lib/CodeGen/CGExpr.cpp
+++ b/clang/lib/CodeGen/CGExpr.cpp
@@ -708,6 +708,8 @@ static bool isFlexibleArrayMemberExpr(const Expr *E) {
DeclContext::decl_iterator(const_cast<FieldDecl *>(FD)));
return ++FI == FD->getParent()->field_end();
}
+ } else if (const auto *IRE = dyn_cast<ObjCIvarRefExpr>(E)) {
+ return IRE->getDecl()->getNextIvar() == nullptr;
}
return false;
diff --git a/clang/test/CodeGenObjC/ubsan-array-bounds.m b/clang/test/CodeGenObjC/ubsan-array-bounds.m
new file mode 100644
index 00000000000..38d1eb310d2
--- /dev/null
+++ b/clang/test/CodeGenObjC/ubsan-array-bounds.m
@@ -0,0 +1,59 @@
+// RUN: %clang_cc1 -x objective-c -emit-llvm -triple x86_64-apple-macosx10.10.0 -Wno-objc-root-class -fsanitize=array-bounds %s -o - | FileCheck %s
+
+@interface FlexibleArray1 {
+@public
+ char chars[0];
+}
+@end
+@implementation FlexibleArray1
+@end
+
+// CHECK-LABEL: test_FlexibleArray1
+char test_FlexibleArray1(FlexibleArray1 *FA1) {
+ // CHECK-NOT: !nosanitize
+ return FA1->chars[1];
+ // CHECK: }
+}
+
+@interface FlexibleArray2 {
+@public
+ char chars[0];
+}
+@end
+@implementation FlexibleArray2 {
+@public
+ char chars2[0];
+}
+@end
+
+// CHECK-LABEL: test_FlexibleArray2_1
+char test_FlexibleArray2_1(FlexibleArray2 *FA2) {
+ // CHECK: !nosanitize
+ return FA2->chars[1];
+ // CHECK: }
+}
+
+// CHECK-LABEL: test_FlexibleArray2_2
+char test_FlexibleArray2_2(FlexibleArray2 *FA2) {
+ // CHECK-NOT: !nosanitize
+ return FA2->chars2[1];
+ // CHECK: }
+}
+
+@interface FlexibleArray3 {
+@public
+ char chars[0];
+}
+@end
+@implementation FlexibleArray3 {
+@public
+ int i;
+}
+@end
+
+// CHECK-LABEL: test_FlexibleArray3
+char test_FlexibleArray3(FlexibleArray3 *FA3) {
+ // CHECK: !nosanitize
+ return FA3->chars[1];
+ // CHECK: }
+}
OpenPOWER on IntegriCloud