zero9178 created this revision. zero9178 added reviewers: Szelethus, aaron.ballman, alexfh, hokein, whisperity. Herald added subscribers: carlosgalvezp, rnkovacs, xazax.hun. zero9178 requested review of this revision. Herald added a project: clang-tools-extra. Herald added a subscriber: cfe-commits.
The purpose of this checker is to flag a missing throw keyword, and does so by checking for the construction of an exception class that is then unused. This works great except that placement new expressions are also flagged as those lead to the construction of an object as well, even though they are not temporary (as that is dependent on the storage). This patch fixes the issue by exempting the match if it is within a placement-new. Fixes https://github.com/llvm/llvm-project/issues/51939 Repository: rG LLVM Github Monorepo https://reviews.llvm.org/D115576 Files: clang-tools-extra/clang-tidy/bugprone/ThrowKeywordMissingCheck.cpp clang-tools-extra/test/clang-tidy/checkers/bugprone-throw-keyword-missing.cpp Index: clang-tools-extra/test/clang-tidy/checkers/bugprone-throw-keyword-missing.cpp =================================================================== --- clang-tools-extra/test/clang-tidy/checkers/bugprone-throw-keyword-missing.cpp +++ clang-tools-extra/test/clang-tidy/checkers/bugprone-throw-keyword-missing.cpp @@ -175,3 +175,14 @@ void exceptionRAIITest() { ExceptionRAII E; } + +namespace std { +typedef decltype(sizeof(void*)) size_t; +} + +void* operator new(std::size_t, void*); + +void placeMentNewTest() { + alignas(RegularException) unsigned char expr[sizeof(RegularException)]; + new (expr) RegularException{}; +} Index: clang-tools-extra/clang-tidy/bugprone/ThrowKeywordMissingCheck.cpp =================================================================== --- clang-tools-extra/clang-tidy/bugprone/ThrowKeywordMissingCheck.cpp +++ clang-tools-extra/clang-tidy/bugprone/ThrowKeywordMissingCheck.cpp @@ -24,11 +24,13 @@ cxxConstructExpr( hasType(cxxRecordDecl( isSameOrDerivedFrom(matchesName("[Ee]xception|EXCEPTION")))), - unless(anyOf(hasAncestor(stmt( - anyOf(cxxThrowExpr(), callExpr(), returnStmt()))), - hasAncestor(decl(anyOf(varDecl(), fieldDecl()))), - allOf(hasAncestor(CtorInitializerList), - unless(hasAncestor(cxxCatchStmt())))))) + unless(anyOf( + hasAncestor( + stmt(anyOf(cxxThrowExpr(), callExpr(), returnStmt()))), + hasAncestor(decl(anyOf(varDecl(), fieldDecl()))), + hasAncestor(expr(cxxNewExpr(hasAnyPlacementArg(anything())))), + allOf(hasAncestor(CtorInitializerList), + unless(hasAncestor(cxxCatchStmt())))))) .bind("temporary-exception-not-thrown"), this); }
Index: clang-tools-extra/test/clang-tidy/checkers/bugprone-throw-keyword-missing.cpp =================================================================== --- clang-tools-extra/test/clang-tidy/checkers/bugprone-throw-keyword-missing.cpp +++ clang-tools-extra/test/clang-tidy/checkers/bugprone-throw-keyword-missing.cpp @@ -175,3 +175,14 @@ void exceptionRAIITest() { ExceptionRAII E; } + +namespace std { +typedef decltype(sizeof(void*)) size_t; +} + +void* operator new(std::size_t, void*); + +void placeMentNewTest() { + alignas(RegularException) unsigned char expr[sizeof(RegularException)]; + new (expr) RegularException{}; +} Index: clang-tools-extra/clang-tidy/bugprone/ThrowKeywordMissingCheck.cpp =================================================================== --- clang-tools-extra/clang-tidy/bugprone/ThrowKeywordMissingCheck.cpp +++ clang-tools-extra/clang-tidy/bugprone/ThrowKeywordMissingCheck.cpp @@ -24,11 +24,13 @@ cxxConstructExpr( hasType(cxxRecordDecl( isSameOrDerivedFrom(matchesName("[Ee]xception|EXCEPTION")))), - unless(anyOf(hasAncestor(stmt( - anyOf(cxxThrowExpr(), callExpr(), returnStmt()))), - hasAncestor(decl(anyOf(varDecl(), fieldDecl()))), - allOf(hasAncestor(CtorInitializerList), - unless(hasAncestor(cxxCatchStmt())))))) + unless(anyOf( + hasAncestor( + stmt(anyOf(cxxThrowExpr(), callExpr(), returnStmt()))), + hasAncestor(decl(anyOf(varDecl(), fieldDecl()))), + hasAncestor(expr(cxxNewExpr(hasAnyPlacementArg(anything())))), + allOf(hasAncestor(CtorInitializerList), + unless(hasAncestor(cxxCatchStmt())))))) .bind("temporary-exception-not-thrown"), this); }
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits