diff --git a/clang-tools-extra/clang-tidy/bugprone/SizeofExpressionCheck.cpp b/clang-tools-extra/clang-tidy/bugprone/SizeofExpressionCheck.cpp index fb161957c5a29..bb23202197fa2 100644 --- a/clang-tools-extra/clang-tidy/bugprone/SizeofExpressionCheck.cpp +++ b/clang-tools-extra/clang-tidy/bugprone/SizeofExpressionCheck.cpp @@ -145,10 +145,17 @@ void SizeofExpressionCheck::registerMatchers(MatchFinder *Finder) { unaryOperator(hasOperatorName("&"), hasUnaryOperand(ignoringParenImpCasts(expr( hasType(qualType(hasCanonicalType(recordType()))))))); + const auto PointerToStructType = type(hasUnqualifiedDesugaredType( + pointerType(pointee(recordType())))); + const auto PointerToStructExpr = expr(ignoringParenImpCasts(expr( + hasType(qualType(hasCanonicalType(PointerToStructType))), + unless(cxxThisExpr())))); Finder->addMatcher( - expr(sizeOfExpr(has(expr(ignoringParenImpCasts( - anyOf(ArrayCastExpr, PointerToArrayExpr, StructAddrOfExpr)))))) + expr(anyOf(sizeOfExpr(has(expr(ignoringParenImpCasts( + anyOf(ArrayCastExpr, PointerToArrayExpr, StructAddrOfExpr, + PointerToStructExpr))))), + sizeOfExpr(has(PointerToStructType)))) .bind("sizeof-pointer-to-aggregate"), this); diff --git a/clang-tools-extra/test/clang-tidy/bugprone-sizeof-expression.cpp b/clang-tools-extra/test/clang-tidy/bugprone-sizeof-expression.cpp index 57b73ea4dc9b2..b82beccc794a1 100644 --- a/clang-tools-extra/test/clang-tidy/bugprone-sizeof-expression.cpp +++ b/clang-tools-extra/test/clang-tidy/bugprone-sizeof-expression.cpp @@ -193,11 +193,15 @@ int Test5() { Array10* ptr; }; typedef const MyStruct TMyStruct; + typedef const MyStruct *PMyStruct; + typedef TMyStruct *PMyStruct2; static TMyStruct kGlocalMyStruct = {}; static TMyStruct volatile * kGlocalMyStructPtr = &kGlocalMyStruct; MyStruct S; + PMyStruct PS; + PMyStruct2 PS2; Array10 A10; int sum = 0; @@ -225,6 +229,14 @@ int Test5() { // CHECK-MESSAGES: :[[@LINE-1]]:10: warning: suspicious usage of 'sizeof(A*)'; pointer to aggregate sum += sizeof(&S); // CHECK-MESSAGES: :[[@LINE-1]]:10: warning: suspicious usage of 'sizeof(A*)'; pointer to aggregate + sum += sizeof(MyStruct*); + // CHECK-MESSAGES: :[[@LINE-1]]:10: warning: suspicious usage of 'sizeof(A*)'; pointer to aggregate + sum += sizeof(PMyStruct); + // CHECK-MESSAGES: :[[@LINE-1]]:10: warning: suspicious usage of 'sizeof(A*)'; pointer to aggregate + sum += sizeof(PS); + // CHECK-MESSAGES: :[[@LINE-1]]:10: warning: suspicious usage of 'sizeof(A*)'; pointer to aggregate + sum += sizeof(PS2); + // CHECK-MESSAGES: :[[@LINE-1]]:10: warning: suspicious usage of 'sizeof(A*)'; pointer to aggregate sum += sizeof(&A10); // CHECK-MESSAGES: :[[@LINE-1]]:10: warning: suspicious usage of 'sizeof(A*)'; pointer to aggregate