Author: vedantk Date: Tue Oct 4 15:36:04 2016 New Revision: 283249 URL: http://llvm.org/viewvc/llvm-project?rev=283249&view=rev Log: [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 Added: cfe/trunk/test/CodeGenObjC/ubsan-array-bounds.m Modified: cfe/trunk/lib/CodeGen/CGExpr.cpp Modified: cfe/trunk/lib/CodeGen/CGExpr.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGExpr.cpp?rev=283249&r1=283248&r2=283249&view=diff ============================================================================== --- cfe/trunk/lib/CodeGen/CGExpr.cpp (original) +++ cfe/trunk/lib/CodeGen/CGExpr.cpp Tue Oct 4 15:36:04 2016 @@ -708,6 +708,8 @@ static bool isFlexibleArrayMemberExpr(co 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; Added: cfe/trunk/test/CodeGenObjC/ubsan-array-bounds.m URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenObjC/ubsan-array-bounds.m?rev=283249&view=auto ============================================================================== --- cfe/trunk/test/CodeGenObjC/ubsan-array-bounds.m (added) +++ cfe/trunk/test/CodeGenObjC/ubsan-array-bounds.m Tue Oct 4 15:36:04 2016 @@ -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: } +} _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits