From e600d4be7d01661ab7601f9ef9c4d3236c377385 Mon Sep 17 00:00:00 2001 From: Anna Zaks <ganna@apple.com> Date: Tue, 9 Jul 2013 01:55:00 +0000 Subject: [PATCH] [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 --- lib/StaticAnalyzer/Core/BugReporterVisitors.cpp | 8 ++++---- test/Analysis/Inputs/system-header-simulator-cxx.h | 8 +++++++- 2 files changed, 11 insertions(+), 5 deletions(-) diff --git a/lib/StaticAnalyzer/Core/BugReporterVisitors.cpp b/lib/StaticAnalyzer/Core/BugReporterVisitors.cpp index 70354fe21c3..fc81d1cc11e 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<NamespaceDecl>(DC); - if (ND && ND->getName() == "list") { + if (const CXXMethodDecl *MD = dyn_cast<CXXMethodDecl>(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 049d6be91b4..8e96508ba58 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; }; -- GitLab