Skip to content

Commit db3fb8a

Browse files
committed
Add checks for negative numbers. We expect __bdos to return 0.
1 parent d5e20be commit db3fb8a

File tree

1 file changed

+69
-0
lines changed

1 file changed

+69
-0
lines changed

clang/test/CodeGen/attr-counted-by.c

Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2141,3 +2141,72 @@ struct multi_subscripts {
21412141
size_t test34(struct multi_subscripts *ptr, int idx1, int idx2) {
21422142
return __bdos(&ptr->flags[idx1][idx2]);
21432143
}
2144+
2145+
// SANITIZE-WITH-ATTR-LABEL: define dso_local void @test35(
2146+
// SANITIZE-WITH-ATTR-SAME: ptr noundef [[P:%.*]], i64 noundef [[INDEX:%.*]]) local_unnamed_addr #[[ATTR0]] {
2147+
// SANITIZE-WITH-ATTR-NEXT: entry:
2148+
// SANITIZE-WITH-ATTR-NEXT: [[DOTCOUNTED_BY_GEP:%.*]] = getelementptr inbounds nuw i8, ptr [[P]], i64 8
2149+
// SANITIZE-WITH-ATTR-NEXT: [[DOTCOUNTED_BY_LOAD:%.*]] = load i32, ptr [[DOTCOUNTED_BY_GEP]], align 4
2150+
// SANITIZE-WITH-ATTR-NEXT: [[TMP0:%.*]] = zext i32 [[DOTCOUNTED_BY_LOAD]] to i64, !nosanitize [[META2]]
2151+
// SANITIZE-WITH-ATTR-NEXT: [[TMP1:%.*]] = icmp ult i64 [[INDEX]], [[TMP0]], !nosanitize [[META2]]
2152+
// SANITIZE-WITH-ATTR-NEXT: br i1 [[TMP1]], label [[CONT3:%.*]], label [[HANDLER_OUT_OF_BOUNDS:%.*]], !prof [[PROF3]], !nosanitize [[META2]]
2153+
// SANITIZE-WITH-ATTR: handler.out_of_bounds:
2154+
// SANITIZE-WITH-ATTR-NEXT: tail call void @__ubsan_handle_out_of_bounds_abort(ptr nonnull @[[GLOB53:[0-9]+]], i64 [[INDEX]]) #[[ATTR7]], !nosanitize [[META2]]
2155+
// SANITIZE-WITH-ATTR-NEXT: unreachable, !nosanitize [[META2]]
2156+
// SANITIZE-WITH-ATTR: cont3:
2157+
// SANITIZE-WITH-ATTR-NEXT: [[ARRAY:%.*]] = getelementptr inbounds nuw i8, ptr [[P]], i64 12
2158+
// SANITIZE-WITH-ATTR-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds nuw [0 x i32], ptr [[ARRAY]], i64 0, i64 [[INDEX]]
2159+
// SANITIZE-WITH-ATTR-NEXT: store i32 0, ptr [[ARRAYIDX]], align 4, !tbaa [[TBAA4]]
2160+
// SANITIZE-WITH-ATTR-NEXT: ret void
2161+
//
2162+
// NO-SANITIZE-WITH-ATTR-LABEL: define dso_local void @test35(
2163+
// NO-SANITIZE-WITH-ATTR-SAME: ptr nocapture noundef writeonly [[P:%.*]], i64 noundef [[INDEX:%.*]]) local_unnamed_addr #[[ATTR0]] {
2164+
// NO-SANITIZE-WITH-ATTR-NEXT: entry:
2165+
// NO-SANITIZE-WITH-ATTR-NEXT: [[ARRAY:%.*]] = getelementptr inbounds nuw i8, ptr [[P]], i64 12
2166+
// NO-SANITIZE-WITH-ATTR-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds nuw [0 x i32], ptr [[ARRAY]], i64 0, i64 [[INDEX]]
2167+
// NO-SANITIZE-WITH-ATTR-NEXT: store i32 0, ptr [[ARRAYIDX]], align 4, !tbaa [[TBAA2]]
2168+
// NO-SANITIZE-WITH-ATTR-NEXT: ret void
2169+
//
2170+
// SANITIZE-WITHOUT-ATTR-LABEL: define dso_local void @test35(
2171+
// SANITIZE-WITHOUT-ATTR-SAME: ptr noundef [[P:%.*]], i64 noundef [[INDEX:%.*]]) local_unnamed_addr #[[ATTR0]] {
2172+
// SANITIZE-WITHOUT-ATTR-NEXT: entry:
2173+
// SANITIZE-WITHOUT-ATTR-NEXT: [[ARRAY:%.*]] = getelementptr inbounds nuw i8, ptr [[P]], i64 12
2174+
// SANITIZE-WITHOUT-ATTR-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds nuw [0 x i32], ptr [[ARRAY]], i64 0, i64 [[INDEX]]
2175+
// SANITIZE-WITHOUT-ATTR-NEXT: store i32 0, ptr [[ARRAYIDX]], align 4, !tbaa [[TBAA2]]
2176+
// SANITIZE-WITHOUT-ATTR-NEXT: ret void
2177+
//
2178+
// NO-SANITIZE-WITHOUT-ATTR-LABEL: define dso_local void @test35(
2179+
// NO-SANITIZE-WITHOUT-ATTR-SAME: ptr nocapture noundef writeonly [[P:%.*]], i64 noundef [[INDEX:%.*]]) local_unnamed_addr #[[ATTR0]] {
2180+
// NO-SANITIZE-WITHOUT-ATTR-NEXT: entry:
2181+
// NO-SANITIZE-WITHOUT-ATTR-NEXT: [[ARRAY:%.*]] = getelementptr inbounds nuw i8, ptr [[P]], i64 12
2182+
// NO-SANITIZE-WITHOUT-ATTR-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds nuw [0 x i32], ptr [[ARRAY]], i64 0, i64 [[INDEX]]
2183+
// NO-SANITIZE-WITHOUT-ATTR-NEXT: store i32 0, ptr [[ARRAYIDX]], align 4, !tbaa [[TBAA2]]
2184+
// NO-SANITIZE-WITHOUT-ATTR-NEXT: ret void
2185+
//
2186+
void test35(struct annotated *p, size_t index) {
2187+
p->array[index] = __bdos(&p->array[-42]);
2188+
}
2189+
2190+
// SANITIZE-WITH-ATTR-LABEL: define dso_local noundef i64 @test35_bdos(
2191+
// SANITIZE-WITH-ATTR-SAME: ptr nocapture noundef readnone [[P:%.*]]) local_unnamed_addr #[[ATTR2]] {
2192+
// SANITIZE-WITH-ATTR-NEXT: entry:
2193+
// SANITIZE-WITH-ATTR-NEXT: ret i64 0
2194+
//
2195+
// NO-SANITIZE-WITH-ATTR-LABEL: define dso_local noundef i64 @test35_bdos(
2196+
// NO-SANITIZE-WITH-ATTR-SAME: ptr nocapture noundef readnone [[P:%.*]]) local_unnamed_addr #[[ATTR3]] {
2197+
// NO-SANITIZE-WITH-ATTR-NEXT: entry:
2198+
// NO-SANITIZE-WITH-ATTR-NEXT: ret i64 0
2199+
//
2200+
// SANITIZE-WITHOUT-ATTR-LABEL: define dso_local noundef i64 @test35_bdos(
2201+
// SANITIZE-WITHOUT-ATTR-SAME: ptr nocapture noundef readnone [[P:%.*]]) local_unnamed_addr #[[ATTR2]] {
2202+
// SANITIZE-WITHOUT-ATTR-NEXT: entry:
2203+
// SANITIZE-WITHOUT-ATTR-NEXT: ret i64 0
2204+
//
2205+
// NO-SANITIZE-WITHOUT-ATTR-LABEL: define dso_local noundef i64 @test35_bdos(
2206+
// NO-SANITIZE-WITHOUT-ATTR-SAME: ptr nocapture noundef readnone [[P:%.*]]) local_unnamed_addr #[[ATTR1]] {
2207+
// NO-SANITIZE-WITHOUT-ATTR-NEXT: entry:
2208+
// NO-SANITIZE-WITHOUT-ATTR-NEXT: ret i64 0
2209+
//
2210+
size_t test35_bdos(struct annotated *p) {
2211+
return __bdos(&p->array[-42]);
2212+
}

0 commit comments

Comments
 (0)