From: Anna Zaks Date: Tue, 9 Jul 2013 01:55:00 +0000 (+0000) Subject: [analyzer] Fixup for r185609: actually do suppress warnings coming out of std::list. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=e600d4be7d01661ab7601f9ef9c4d3236c377385;p=clang [analyzer] Fixup for r185609: actually do suppress warnings coming out of std::list. list is the name of a class, not a namespace. Change the test as well - the previous version did not test properly. Fixes radar://14317928. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@185898 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/StaticAnalyzer/Core/BugReporterVisitors.cpp b/lib/StaticAnalyzer/Core/BugReporterVisitors.cpp index 70354fe21c..fc81d1cc11 100644 --- a/lib/StaticAnalyzer/Core/BugReporterVisitors.cpp +++ b/lib/StaticAnalyzer/Core/BugReporterVisitors.cpp @@ -1541,12 +1541,12 @@ LikelyFalsePositiveSuppressionBRVisitor::getEndPath(BugReporterContext &BRC, // The analyzer issues a false use-after-free when std::list::pop_front // or std::list::pop_back are called multiple times because we cannot // reason about the internal invariants of the datastructure. - const DeclContext *DC = - D->getDeclContext()->getEnclosingNamespaceContext(); - const NamespaceDecl *ND = dyn_cast(DC); - if (ND && ND->getName() == "list") { + if (const CXXMethodDecl *MD = dyn_cast(D)) { + const CXXRecordDecl *CD = MD->getParent(); + if (CD->getName() == "list") { BR.markInvalid(getTag(), 0); return 0; + } } } } diff --git a/test/Analysis/Inputs/system-header-simulator-cxx.h b/test/Analysis/Inputs/system-header-simulator-cxx.h index 049d6be91b..8e96508ba5 100644 --- a/test/Analysis/Inputs/system-header-simulator-cxx.h +++ b/test/Analysis/Inputs/system-header-simulator-cxx.h @@ -99,7 +99,13 @@ namespace std { : private __list_imp<_Tp, _Alloc> { public: - void pop_front(); + void pop_front() { + // Fake use-after-free. + // No warning is expected as we are suppressing warning comming + // out of std::list. + int z = 0; + z = 5/z; + } bool empty() const; };