70 lines · plain
1// RUN: %clang_cc1 -no-enable-noundef-analysis -x objective-c -emit-llvm -triple x86_64-apple-macosx10.10.0 -fsanitize=bool -o - -w < %s | FileCheck %s -check-prefixes=SHARED,OBJC2// RUN: %clang_cc1 -no-enable-noundef-analysis -x objective-c++ -emit-llvm -triple x86_64-apple-macosx10.10.0 -fsanitize=bool -o - -w < %s | FileCheck %s -check-prefixes=SHARED,OBJC3// RUN: %clang_cc1 -no-enable-noundef-analysis -x c -emit-llvm -triple x86_64-apple-macosx10.10.0 -fsanitize=bool -o - < %s | FileCheck %s -check-prefixes=SHARED,C4 5typedef signed char BOOL;6 7// SHARED-LABEL: define{{.*}}f18BOOL f1(void) {9 // OBJC: call void @__ubsan_handle_load_invalid_value10 // C-NOT: call void @__ubsan_handle_load_invalid_value11 BOOL a = 2;12 return a + 1;13 // SHARED: ret i814}15 16struct S1 {17 BOOL b1 : 1;18};19 20// SHARED-LABEL: define{{.*}}f221BOOL f2(struct S1 *s) {22 // OBJC: [[LOAD:%.*]] = load i8, ptr {{.*}}23 // OBJC: [[SHL:%.*]] = shl i8 [[LOAD]], 724 // OBJC: [[ASHR:%.*]] = ashr i8 [[SHL]], 725 // OBJC: icmp ule i8 [[ASHR]], 1, !nosanitize26 // OBJC: call void @__ubsan_handle_load_invalid_value27 28 // C-NOT: call void @__ubsan_handle_load_invalid_value29 return s->b1;30 // SHARED: ret i831}32 33#ifdef __OBJC__34@interface SuperClass35@end36 37@interface I1 : SuperClass {38@public39 BOOL b1 : 1;40}41@property (nonatomic) BOOL b1;42@end43@implementation I144@synthesize b1;45@end46 47// Check the synthesized getter.48// OBJC-LABEL: define internal signext i8 @"\01-[I1 b1]"49// OBJC: [[IVAR:%.*]] = load i64, ptr @"OBJC_IVAR_$_I1.b1"50// OBJC: [[ADDR:%.*]] = getelementptr inbounds i8, ptr {{.*}}, i64 [[IVAR]]51// OBJC: [[LOAD:%.*]] = load i8, ptr {{.*}}52// OBJC: [[SHL:%.*]] = shl i8 [[LOAD]], 753// OBJC: [[ASHR:%.*]] = ashr i8 [[SHL]], 754// OBJC: icmp ule i8 [[ASHR]], 1, !nosanitize55// OBJC: call void @__ubsan_handle_load_invalid_value56 57// Also check direct accesses to the ivar.58// OBJC-LABEL: define{{.*}}f359BOOL f3(I1 *i) {60 // OBJC: [[LOAD:%.*]] = load i8, ptr {{.*}}61 // OBJC: [[SHL:%.*]] = shl i8 [[LOAD]], 762 // OBJC: [[ASHR:%.*]] = ashr i8 [[SHL]], 763 // OBJC: icmp ule i8 [[ASHR]], 1, !nosanitize64 // OBJC: call void @__ubsan_handle_load_invalid_value65 66 return i->b1;67 // OBJC: ret i868}69#endif /* __OBJC__ */70