]> granicus.if.org Git - clang/commit
[analyzer] Make GRBugReporter::generatePathDiagnostic iterative, not recursive.
authorJordan Rose <jordan_rose@apple.com>
Fri, 15 Mar 2013 21:41:55 +0000 (21:41 +0000)
committerJordan Rose <jordan_rose@apple.com>
Fri, 15 Mar 2013 21:41:55 +0000 (21:41 +0000)
commit2f13eb116e62161c5e4d198f7831f226e5cea9da
tree36b945a07920239f3e7c625d9a13fc8ebf89b524
parentcc08ca9b3cd2b715a699bcc772ce2e83a502915a
[analyzer] Make GRBugReporter::generatePathDiagnostic iterative, not recursive.

The previous generatePathDiagnostic() was intended to be tail-recursive,
restarting and trying again if a report was marked invalid. However:
 (1) this leaked all the cloned visitors, which weren't being deleted, and
 (2) this wasn't actually tail-recursive because some local variables had
     non-trivial destructors.

This was causing us to overflow the stack on inputs with large numbers of
reports in the same equivalence class, such as sqlite3.c. Being iterative
at least prevents us from blowing out the stack, but doesn't solve the
performance issue: suppressing thousands (yes, thousands) of paths in the
same equivalence class is expensive. I'm looking into that now.

<rdar://problem/13423498>

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@177189 91177308-0d34-0410-b5e6-96231b3b80d8
lib/StaticAnalyzer/Core/BugReporter.cpp