From e0ad10404d246b8def67ba88b4a0246af7e2b102 Mon Sep 17 00:00:00 2001 From: Anna Zaks 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. llvm-svn: 185898 --- clang/lib/StaticAnalyzer/Core/BugReporterVisitors.cpp | 8 ++++---- clang/test/Analysis/Inputs/system-header-simulator-cxx.h | 8 +++++++- 2 files changed, 11 insertions(+), 5 deletions(-) diff --git a/clang/lib/StaticAnalyzer/Core/BugReporterVisitors.cpp b/clang/lib/StaticAnalyzer/Core/BugReporterVisitors.cpp index 70354fe21c3f..fc81d1cc11ec 100644 --- a/clang/lib/StaticAnalyzer/Core/BugReporterVisitors.cpp +++ b/clang/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/clang/test/Analysis/Inputs/system-header-simulator-cxx.h b/clang/test/Analysis/Inputs/system-header-simulator-cxx.h index 049d6be91b46..8e96508ba586 100644 --- a/clang/test/Analysis/Inputs/system-header-simulator-cxx.h +++ b/clang/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; };