Changeset View
Changeset View
Standalone View
Standalone View
test/CodeGen/ubsan-pointer-overflow.m
// RUN: %clang_cc1 -triple x86_64-apple-darwin10 -w -emit-llvm -o - %s -fsanitize=pointer-overflow | FileCheck %s | // RUN: %clang_cc1 -triple x86_64-apple-darwin10 -w -emit-llvm -o - %s -fsanitize=pointer-overflow | FileCheck %s | ||||
// CHECK-LABEL: define void @unary_arith | // CHECK-LABEL: define void @unary_arith | ||||
void unary_arith(char *p) { | void unary_arith(char *p) { | ||||
// CHECK: [[BASE:%.*]] = ptrtoint i8* {{.*}} to i64, !nosanitize | // CHECK: [[BASE:%.*]] = ptrtoint i8* {{.*}} to i64, !nosanitize | ||||
// CHECK-NEXT: [[COMPGEP:%.*]] = add i64 [[BASE]], 1, !nosanitize | // CHECK-NEXT: [[COMPGEP:%.*]] = add i64 [[BASE]], 1, !nosanitize | ||||
// CHECK-NEXT: [[POSVALID:%.*]] = icmp uge i64 [[COMPGEP]], [[BASE]], !nosanitize | // CHECK-NEXT: [[POSVALID:%.*]] = icmp uge i64 [[COMPGEP]], [[BASE]], !nosanitize | ||||
// CHECK-NEXT: br i1 [[POSVALID]]{{.*}}, !nosanitize | // CHECK-NEXT: br i1 [[POSVALID]]{{.*}}, !nosanitize | ||||
// CHECK: call void @__ubsan_handle_pointer_overflow{{.*}}, i64 [[BASE]], i64 [[COMPGEP]]){{.*}}, !nosanitize | // CHECK: call void @__ubsan_handle_pointer_overflow{{.*}}, i64 [[BASE]], i64 [[COMPGEP]]){{.*}}, !nosanitize | ||||
++p; | ++p; | ||||
// CHECK: ptrtoint i8* {{.*}} to i64, !nosanitize | // CHECK: ptrtoint i8* {{.*}} to i64, !nosanitize | ||||
// CHECK-NEXT: add i64 {{.*}}, -1, !nosanitize | // CHECK-NEXT: [[COMPGEP:%.*]] = add i64 {{.*}}, -1, !nosanitize | ||||
// CHECK: select i1 false{{.*}}, !nosanitize | // CHECK: [[NEGVALID:%.*]] = icmp ule i64 [[COMPGEP]], {{.*}}, !nosanitize | ||||
// CHECK-NOT: select | |||||
// CHECK: br i1 [[NEGVALID]]{{.*}}, !nosanitize | |||||
// CHECK: call void @__ubsan_handle_pointer_overflow{{.*}} | // CHECK: call void @__ubsan_handle_pointer_overflow{{.*}} | ||||
--p; | --p; | ||||
// CHECK: icmp uge i64 | |||||
// CHECK-NOT: select | // CHECK-NOT: select | ||||
// CHECK: call void @__ubsan_handle_pointer_overflow{{.*}} | // CHECK: call void @__ubsan_handle_pointer_overflow{{.*}} | ||||
p++; | p++; | ||||
// CHECK: select | // CHECK: icmp ule i64 | ||||
// CHECK-NOT: select | |||||
// CHECK: call void @__ubsan_handle_pointer_overflow{{.*}} | // CHECK: call void @__ubsan_handle_pointer_overflow{{.*}} | ||||
p--; | p--; | ||||
} | } | ||||
// CHECK-LABEL: define void @binary_arith | // CHECK-LABEL: define void @binary_arith | ||||
void binary_arith(char *p, int i) { | void binary_arith(char *p, int i) { | ||||
// CHECK: [[SMUL:%.*]] = call { i64, i1 } @llvm.smul.with.overflow.i64(i64 1, i64 %{{.*}}), !nosanitize | // CHECK: [[SMUL:%.*]] = call { i64, i1 } @llvm.smul.with.overflow.i64(i64 1, i64 %{{.*}}), !nosanitize | ||||
// CHECK-NEXT: [[SMULOFLOW:%.*]] = extractvalue { i64, i1 } [[SMUL]], 1, !nosanitize | // CHECK-NEXT: [[SMULOFLOW:%.*]] = extractvalue { i64, i1 } [[SMUL]], 1, !nosanitize | ||||
Show All 28 Lines | void binary_arith_unsigned(char *p, unsigned i) { | ||||
// CHECK-NEXT: [[POSVALID:%.*]] = icmp uge i64 [[COMPGEP]], [[BASE]], !nosanitize | // CHECK-NEXT: [[POSVALID:%.*]] = icmp uge i64 [[COMPGEP]], [[BASE]], !nosanitize | ||||
// CHECK: [[VALID:%.*]] = and i1 [[POSVALID]], [[OFFSETVALID]], !nosanitize | // CHECK: [[VALID:%.*]] = and i1 [[POSVALID]], [[OFFSETVALID]], !nosanitize | ||||
// CHECK-NEXT: br i1 [[VALID]]{{.*}}, !nosanitize | // CHECK-NEXT: br i1 [[VALID]]{{.*}}, !nosanitize | ||||
// CHECK: call void @__ubsan_handle_pointer_overflow{{.*}}, i64 [[BASE]], i64 [[COMPGEP]]){{.*}}, !nosanitize | // CHECK: call void @__ubsan_handle_pointer_overflow{{.*}}, i64 [[BASE]], i64 [[COMPGEP]]){{.*}}, !nosanitize | ||||
p + i; | p + i; | ||||
// CHECK: [[OFFSET:%.*]] = sub i64 0, {{.*}} | // CHECK: [[OFFSET:%.*]] = sub i64 0, {{.*}} | ||||
// CHECK-NEXT: getelementptr inbounds {{.*}} [[OFFSET]] | // CHECK-NEXT: getelementptr inbounds {{.*}} [[OFFSET]] | ||||
// CHECK: select | // CHECK: icmp ule i64 | ||||
// CHECK-NOT: select | |||||
// CHECK: call void @__ubsan_handle_pointer_overflow{{.*}} | // CHECK: call void @__ubsan_handle_pointer_overflow{{.*}} | ||||
p - i; | p - i; | ||||
} | } | ||||
// CHECK-LABEL: define void @fixed_len_array | // CHECK-LABEL: define void @fixed_len_array | ||||
void fixed_len_array(int k) { | void fixed_len_array(int k) { | ||||
// CHECK: getelementptr inbounds [10 x [10 x i32]], [10 x [10 x i32]]* [[ARR:%.*]], i64 0, i64 [[IDXPROM:%.*]] | // CHECK: getelementptr inbounds [10 x [10 x i32]], [10 x [10 x i32]]* [[ARR:%.*]], i64 0, i64 [[IDXPROM:%.*]] | ||||
// CHECK-NEXT: [[SMUL:%.*]] = call { i64, i1 } @llvm.smul.with.overflow.i64(i64 40, i64 [[IDXPROM]]), !nosanitize | // CHECK-NEXT: [[SMUL:%.*]] = call { i64, i1 } @llvm.smul.with.overflow.i64(i64 40, i64 [[IDXPROM]]), !nosanitize | ||||
▲ Show 20 Lines • Show All 138 Lines • Show Last 20 Lines |