forked from OSchip/llvm-project
[clang-tidy] Optimize query in bugprone-exception-escape
Checking whether a functions throws indirectly may be very expensive because it needs to visit its whole call graph. Therefore we should first check whether the function is forbidden to throw and only check whether it throws afterward. This also seems to solve bug https://bugs.llvm.org/show_bug.cgi?id=39167 where the execution time is so long that it seems to hang. Differential Revision: https://reviews.llvm.org/D53187 llvm-svn: 344444
This commit is contained in:
parent
45ca9b705c
commit
d053f5c616
|
@ -190,12 +190,12 @@ void ExceptionEscapeCheck::registerMatchers(MatchFinder *Finder) {
|
|||
return;
|
||||
|
||||
Finder->addMatcher(
|
||||
functionDecl(allOf(throws(unless(isIgnored(IgnoredExceptions))),
|
||||
anyOf(isNoThrow(), cxxDestructorDecl(),
|
||||
functionDecl(allOf(anyOf(isNoThrow(), cxxDestructorDecl(),
|
||||
cxxConstructorDecl(isMoveConstructor()),
|
||||
cxxMethodDecl(isMoveAssignmentOperator()),
|
||||
hasName("main"), hasName("swap"),
|
||||
isEnabled(FunctionsThatShouldNotThrow))))
|
||||
isEnabled(FunctionsThatShouldNotThrow)),
|
||||
throws(unless(isIgnored(IgnoredExceptions)))))
|
||||
.bind("thrower"),
|
||||
this);
|
||||
}
|
||||
|
|
|
@ -21,6 +21,8 @@ are always possible to implement in a non throwing way. Non throwing ``swap()``
|
|||
operations are also used to create move operations. A throwing ``main()``
|
||||
function also results in unexpected termination.
|
||||
|
||||
WARNING! This check may be expensive on large source files.
|
||||
|
||||
Options
|
||||
-------
|
||||
|
||||
|
|
|
@ -258,6 +258,31 @@ void this_counts(int n) noexcept {
|
|||
throw ignored1();
|
||||
}
|
||||
|
||||
void thrower(int n) {
|
||||
throw n;
|
||||
}
|
||||
|
||||
int directly_recursive(int n) noexcept {
|
||||
// CHECK-MESSAGES: :[[@LINE-1]]:5: warning: an exception may be thrown in funcion 'directly_recursive' which should not throw exceptions
|
||||
if (n == 0)
|
||||
thrower(n);
|
||||
return directly_recursive(n);
|
||||
}
|
||||
|
||||
int indirectly_recursive(int n) noexcept;
|
||||
// CHECK-MESSAGES: :[[@LINE-1]]:5: warning: an exception may be thrown in functin 'indirectly_recursive' which should not throw exceptions
|
||||
|
||||
int recursion_helper(int n) {
|
||||
indirectly_recursive(n);
|
||||
}
|
||||
|
||||
int indirectly_recursive(int n) noexcept {
|
||||
// CHECK-MESSAGES: :[[@LINE-1]]:5: warning: an exception may be thrown in funcion 'indirectly_recursive' which should not throw exceptions
|
||||
if (n == 0)
|
||||
thrower(n);
|
||||
return recursion_helper(n);
|
||||
}
|
||||
|
||||
int main() {
|
||||
// CHECK-MESSAGES: :[[@LINE-1]]:5: warning: an exception may be thrown in function 'main' which should not throw exceptions
|
||||
throw 1;
|
||||
|
|
Loading…
Reference in New Issue