Skip to content

Commit 0df1cf0

Browse files
authored
Merge pull request #8195 from jkorous-apple/cxx-safe-buffers/integrate/func-ptr-calls
[-Wunsafe-buffer-usage] Fixits for array args of func-ptr calls (llvm#80358)
2 parents 48dba33 + 45caf80 commit 0df1cf0

File tree

2 files changed

+63
-10
lines changed

2 files changed

+63
-10
lines changed

clang/lib/Analysis/UnsafeBufferUsage.cpp

Lines changed: 15 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -282,11 +282,13 @@ isInUnspecifiedPointerContext(internal::Matcher<Stmt> InnerMatcher) {
282282
// 4. the operand of a pointer subtraction operation
283283
// (i.e., computing the distance between two pointers); or ...
284284

285-
auto CallArgMatcher =
286-
callExpr(forEachArgumentWithParam(
287-
InnerMatcher,
288-
hasPointerType() /* array also decays to pointer type*/),
289-
unless(callee(functionDecl(hasAttr(attr::UnsafeBufferUsage)))));
285+
// clang-format off
286+
auto CallArgMatcher = callExpr(
287+
forEachArgumentWithParamType(
288+
InnerMatcher,
289+
isAnyPointer() /* array also decays to pointer type*/),
290+
unless(callee(
291+
functionDecl(hasAttr(attr::UnsafeBufferUsage)))));
290292

291293
auto CastOperandMatcher =
292294
castExpr(anyOf(hasCastKind(CastKind::CK_PointerToIntegral),
@@ -301,11 +303,14 @@ isInUnspecifiedPointerContext(internal::Matcher<Stmt> InnerMatcher) {
301303
// A matcher that matches pointer subtractions:
302304
auto PtrSubtractionMatcher =
303305
binaryOperator(hasOperatorName("-"),
304-
// Note that here we need both LHS and RHS to be
305-
// pointer. Then the inner matcher can match any of
306-
// them:
307-
allOf(hasLHS(hasPointerType()), hasRHS(hasPointerType())),
308-
eachOf(hasLHS(InnerMatcher), hasRHS(InnerMatcher)));
306+
// Note that here we need both LHS and RHS to be
307+
// pointer. Then the inner matcher can match any of
308+
// them:
309+
allOf(hasLHS(hasPointerType()),
310+
hasRHS(hasPointerType())),
311+
eachOf(hasLHS(InnerMatcher),
312+
hasRHS(InnerMatcher)));
313+
// clang-format on
309314

310315
return stmt(anyOf(CallArgMatcher, CastOperandMatcher, CompOperandMatcher,
311316
PtrSubtractionMatcher));
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
// RUN: %clang_cc1 -std=c++20 -Wunsafe-buffer-usage \
2+
// RUN: -fsafe-buffer-usage-suggestions \
3+
// RUN: -fdiagnostics-parseable-fixits %s 2>&1 | FileCheck %s
4+
5+
void unsafe_array_func_ptr_call(void (*fn_ptr)(int *param)) {
6+
int p[32];
7+
// CHECK-DAG: fix-it:"{{.*}}":{[[@LINE-1]]:3-[[@LINE-1]]:12}:"std::array<int, 32> p"
8+
9+
p[5] = 10;
10+
fn_ptr(p);
11+
// CHECK-DAG: fix-it:"{{.*}}":{[[@LINE-1]]:11-[[@LINE-1]]:11}:".data()"
12+
}
13+
14+
void unsafe_ptr_func_ptr_call(void (*fn_ptr)(int *param)) {
15+
int *p;
16+
// CHECK-DAG: fix-it:"{{.*}}":{[[@LINE-1]]:3-[[@LINE-1]]:9}:"std::span<int> p"
17+
18+
p[5] = 10;
19+
fn_ptr(p);
20+
// CHECK-DAG: fix-it:"{{.*}}":{[[@LINE-1]]:11-[[@LINE-1]]:11}:".data()"
21+
}
22+
23+
void addr_of_unsafe_ptr_func_ptr_call(void (*fn_ptr)(int *param)) {
24+
int *p;
25+
// CHECK-DAG: fix-it:"{{.*}}":{[[@LINE-1]]:3-[[@LINE-1]]:9}:"std::span<int> p"
26+
27+
p[5] = 10;
28+
fn_ptr(&p[0]);
29+
// CHECK-DAG: fix-it:"{{.*}}":{[[@LINE-1]]:10-[[@LINE-1]]:15}:"p.data()"
30+
}
31+
32+
void addr_of_unsafe_ptr_w_offset_func_ptr_call(void (*fn_ptr)(int *param)) {
33+
int *p;
34+
// CHECK-DAG: fix-it:"{{.*}}":{[[@LINE-1]]:3-[[@LINE-1]]:9}:"std::span<int> p"
35+
36+
p[5] = 10;
37+
fn_ptr(&p[3]);
38+
// CHECK-DAG: fix-it:"{{.*}}":{[[@LINE-1]]:10-[[@LINE-1]]:15}:"&p.data()[3]"
39+
}
40+
41+
void preincrement_unsafe_ptr_func_ptr_call(void (*fn_ptr)(int *param)) {
42+
int *p;
43+
// CHECK-DAG: fix-it:"{{.*}}":{[[@LINE-1]]:3-[[@LINE-1]]:9}:"std::span<int> p"
44+
45+
p[5] = 10;
46+
fn_ptr(++p);
47+
// CHECK-DAG: fix-it:"{{.*}}":{[[@LINE-1]]:10-[[@LINE-1]]:13}:"(p = p.subspan(1)).data()"
48+
}

0 commit comments

Comments
 (0)