Author: ziqingluo-90 Date: 2022-12-16T21:04:41-08:00 New Revision: f6c54cdbc4394cd32f0dde990f217ca8f534a136
URL: https://github.com/llvm/llvm-project/commit/f6c54cdbc4394cd32f0dde990f217ca8f534a136 DIFF: https://github.com/llvm/llvm-project/commit/f6c54cdbc4394cd32f0dde990f217ca8f534a136.diff LOG: [-Wunsafe-buffer-usage] Ignore array subscript on literal zero Unsafe Buffer Usage analysis only warns unsafe buffer accesses but not pointer dereferences. An array subscript on a literal zero is equivalent to dereference a pointer thus we do not want to warn it. Reviewed By: NoQ Differential Revision: https://reviews.llvm.org/D138321 Added: Modified: clang/lib/Analysis/UnsafeBufferUsage.cpp clang/test/SemaCXX/warn-unsafe-buffer-usage.cpp Removed: ################################################################################ diff --git a/clang/lib/Analysis/UnsafeBufferUsage.cpp b/clang/lib/Analysis/UnsafeBufferUsage.cpp index ba459d2176ad..85449c4c5b1c 100644 --- a/clang/lib/Analysis/UnsafeBufferUsage.cpp +++ b/clang/lib/Analysis/UnsafeBufferUsage.cpp @@ -189,9 +189,9 @@ class ArraySubscriptGadget : public UnsafeGadget { static Matcher matcher() { // FIXME: What if the index is integer literal 0? Should this be // a safe gadget in this case? - return stmt( - arraySubscriptExpr(hasBase(ignoringParenImpCasts(hasPointerType()))) - .bind(ArraySubscrTag)); + return stmt(arraySubscriptExpr(hasBase(ignoringParenImpCasts(hasPointerType())), + unless(hasIndex(integerLiteral(equals(0))))) + .bind(ArraySubscrTag)); } const ArraySubscriptExpr *getBaseStmt() const override { return ASE; } diff --git a/clang/test/SemaCXX/warn-unsafe-buffer-usage.cpp b/clang/test/SemaCXX/warn-unsafe-buffer-usage.cpp index bff9fd666ac6..9b1481e8a2ed 100644 --- a/clang/test/SemaCXX/warn-unsafe-buffer-usage.cpp +++ b/clang/test/SemaCXX/warn-unsafe-buffer-usage.cpp @@ -29,10 +29,10 @@ void * voidPtrCall(void); char * charPtrCall(void); void testArraySubscripts(int *p, int **pp) { - foo(p[0], // expected-warning{{unchecked operation on raw buffer in expression}} - pp[0][0], // expected-warning2{{unchecked operation on raw buffer in expression}} - 0[0[pp]], // expected-warning2{{unchecked operation on raw buffer in expression}} - 0[pp][0] // expected-warning2{{unchecked operation on raw buffer in expression}} + foo(p[1], // expected-warning{{unchecked operation on raw buffer in expression}} + pp[1][1], // expected-warning2{{unchecked operation on raw buffer in expression}} + 1[1[pp]], // expected-warning2{{unchecked operation on raw buffer in expression}} + 1[pp][1] // expected-warning2{{unchecked operation on raw buffer in expression}} ); if (p[3]) { // expected-warning{{unchecked operation on raw buffer in expression}} @@ -50,11 +50,18 @@ void testArraySubscripts(int *p, int **pp) { int a[10], b[10][10]; // Not to warn subscripts on arrays - foo(a[0], a[1], - 0[a], 1[a], + foo(a[1], 1[a], b[3][4], 4[b][3], 4[3[b]]); + + // Not to warn when index is zero + foo(p[0], pp[0][0], 0[0[pp]], 0[pp][0], + ((int*)voidPtrCall())[0], + 0[(int*)voidPtrCall()], + charPtrCall()[0], + 0[charPtrCall()] + ); } void testArraySubscriptsWithAuto(int *p, int **pp) { @@ -62,19 +69,19 @@ void testArraySubscriptsWithAuto(int *p, int **pp) { auto ap1 = a; - foo(ap1[0]); // expected-warning{{unchecked operation on raw buffer in expression}} + foo(ap1[1]); // expected-warning{{unchecked operation on raw buffer in expression}} auto ap2 = p; - foo(ap2[0]); // expected-warning{{unchecked operation on raw buffer in expression}} + foo(ap2[1]); // expected-warning{{unchecked operation on raw buffer in expression}} auto ap3 = pp; - foo(ap3[0][0]); // expected-warning2{{unchecked operation on raw buffer in expression}} + foo(ap3[1][1]); // expected-warning2{{unchecked operation on raw buffer in expression}} auto ap4 = *pp; - foo(ap4[0]); // expected-warning{{unchecked operation on raw buffer in expression}} + foo(ap4[1]); // expected-warning{{unchecked operation on raw buffer in expression}} } void testUnevaluatedContext(int * p) { _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits