baloghadamsoftware created this revision. baloghadamsoftware added reviewers: alexfh, aaron.ballman, lebedev.ri, JonasToth. baloghadamsoftware added a project: clang-tools-extra. Herald added subscribers: gamesh411, rnkovacs. Herald added a project: clang.
Accidentally taking the size of a struct-pointer type or a value of this type is more common than explicitly using the `&` operator for the value. This patch extends the check to include these cases. Repository: rCTE Clang Tools Extra https://reviews.llvm.org/D61260 Files: clang-tidy/bugprone/SizeofExpressionCheck.cpp test/clang-tidy/bugprone-sizeof-expression.cpp Index: test/clang-tidy/bugprone-sizeof-expression.cpp =================================================================== --- test/clang-tidy/bugprone-sizeof-expression.cpp +++ test/clang-tidy/bugprone-sizeof-expression.cpp @@ -193,11 +193,13 @@ Array10* ptr; }; typedef const MyStruct TMyStruct; + typedef const MyStruct *PMyStruct; static TMyStruct kGlocalMyStruct = {}; static TMyStruct volatile * kGlocalMyStructPtr = &kGlocalMyStruct; MyStruct S; + PMyStruct PS; Array10 A10; int sum = 0; @@ -225,6 +227,12 @@ // 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(&A10); // CHECK-MESSAGES: :[[@LINE-1]]:10: warning: suspicious usage of 'sizeof(A*)'; pointer to aggregate Index: clang-tidy/bugprone/SizeofExpressionCheck.cpp =================================================================== --- clang-tidy/bugprone/SizeofExpressionCheck.cpp +++ clang-tidy/bugprone/SizeofExpressionCheck.cpp @@ -142,10 +142,17 @@ 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);
Index: test/clang-tidy/bugprone-sizeof-expression.cpp =================================================================== --- test/clang-tidy/bugprone-sizeof-expression.cpp +++ test/clang-tidy/bugprone-sizeof-expression.cpp @@ -193,11 +193,13 @@ Array10* ptr; }; typedef const MyStruct TMyStruct; + typedef const MyStruct *PMyStruct; static TMyStruct kGlocalMyStruct = {}; static TMyStruct volatile * kGlocalMyStructPtr = &kGlocalMyStruct; MyStruct S; + PMyStruct PS; Array10 A10; int sum = 0; @@ -225,6 +227,12 @@ // 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(&A10); // CHECK-MESSAGES: :[[@LINE-1]]:10: warning: suspicious usage of 'sizeof(A*)'; pointer to aggregate Index: clang-tidy/bugprone/SizeofExpressionCheck.cpp =================================================================== --- clang-tidy/bugprone/SizeofExpressionCheck.cpp +++ clang-tidy/bugprone/SizeofExpressionCheck.cpp @@ -142,10 +142,17 @@ 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);
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits