Skip to content

Commit 17f7b9e

Browse files
committed
[-Wunsafe-buffer-usage] Avoid multi-dimentional arrays properly
Array element can be for example VLA which given its non-constant length can't be transformed to std::array.
1 parent d49d5fd commit 17f7b9e

File tree

2 files changed

+18
-3
lines changed

2 files changed

+18
-3
lines changed

clang/lib/Analysis/UnsafeBufferUsage.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2481,7 +2481,7 @@ static FixItList fixVarDeclWithArray(const VarDecl *D, const ASTContext &Ctx,
24812481
const QualType &ArrayEltT = CAT->getElementType();
24822482
assert(!ArrayEltT.isNull() && "Trying to fix a non-array type variable!");
24832483
// FIXME: support multi-dimensional arrays
2484-
if (isa<clang::ConstantArrayType>(ArrayEltT))
2484+
if (isa<clang::ArrayType>(ArrayEltT.getCanonicalType()))
24852485
return {};
24862486

24872487
const SourceLocation IdentifierLoc = getVarDeclIdentifierLoc(D);

clang/test/SemaCXX/warn-unsafe-buffer-usage-fixits-local-var-array.cpp

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,21 +16,36 @@ void array2d(unsigned idx) {
1616
buffer[idx][idx] = 0;
1717
}
1818

19+
void array2d_vla(unsigned sz, unsigned idx) {
20+
int buffer1[10][sz];
21+
// CHECK-NOT: fix-it:"{{.*}}":{[[@LINE-1]]
22+
int buffer2[sz][10];
23+
// CHECK-NOT: fix-it:"{{.*}}":{[[@LINE-1]]
24+
buffer1[idx][idx] = 0;
25+
buffer2[idx][idx] = 0;
26+
}
27+
1928
void array2d_assign_from_elem(unsigned idx) {
2029
int buffer[10][10];
2130
// CHECK-NOT: fix-it:"{{.*}}":{[[@LINE-1]]
2231
int a = buffer[idx][idx];
2332
}
2433

25-
void array2d_use(unsigned);
34+
void array2d_use(int *);
2635
void array2d_call(unsigned idx) {
2736
int buffer[10][10];
2837
// CHECK-NOT: fix-it:"{{.*}}":{[[@LINE-1]]
29-
array2d_use(buffer[idx][idx]);
38+
array2d_use(buffer[idx]);
39+
}
40+
void array2d_call_vla(unsigned sz, unsigned idx) {
41+
int buffer[10][sz];
42+
// CHECK-NOT: fix-it:"{{.*}}":{[[@LINE-1]]
43+
array2d_use(buffer[idx]);
3044
}
3145

3246
void array2d_typedef(unsigned idx) {
3347
typedef int ten_ints_t[10];
48+
// CHECK-NOT: fix-it:"{{.*}}":{[[@LINE-1]]
3449
ten_ints_t buffer[10];
3550
// CHECK-NOT: fix-it:"{{.*}}":{[[@LINE-1]]
3651
buffer[idx][idx] = 0;

0 commit comments

Comments
 (0)