[clang] cc2ef19 - [analyzer] Handle NTTP invocation in CallContext.getCalleeDecl()
Valeriy Savchenko via cfe-commits
cfe-commits at lists.llvm.org
Fri Jun 18 06:46:10 PDT 2021
Author: Tomasz KamiĆski
Date: 2021-06-18T16:32:19+03:00
New Revision: cc2ef195560999d0690a8d8805ea811270e38f26
URL: https://github.com/llvm/llvm-project/commit/cc2ef195560999d0690a8d8805ea811270e38f26
DIFF: https://github.com/llvm/llvm-project/commit/cc2ef195560999d0690a8d8805ea811270e38f26.diff
LOG: [analyzer] Handle NTTP invocation in CallContext.getCalleeDecl()
This fixes a crash in MallocChecker for the situation when operator new (delete) is invoked via NTTP and makes the behavior of CallContext.getCalleeDecl(Expr) identical to CallEvent.getDecl().
Reviewed By: vsavchenko
Differential Revision: https://reviews.llvm.org/D103025
Added:
Modified:
clang/lib/StaticAnalyzer/Core/CheckerContext.cpp
clang/test/Analysis/NewDelete-checker-test.cpp
Removed:
################################################################################
diff --git a/clang/lib/StaticAnalyzer/Core/CheckerContext.cpp b/clang/lib/StaticAnalyzer/Core/CheckerContext.cpp
index 3d44d2cbc069d..3d64ce453479f 100644
--- a/clang/lib/StaticAnalyzer/Core/CheckerContext.cpp
+++ b/clang/lib/StaticAnalyzer/Core/CheckerContext.cpp
@@ -19,6 +19,10 @@ using namespace clang;
using namespace ento;
const FunctionDecl *CheckerContext::getCalleeDecl(const CallExpr *CE) const {
+ const FunctionDecl *D = CE->getDirectCallee();
+ if (D)
+ return D;
+
const Expr *Callee = CE->getCallee();
SVal L = Pred->getSVal(Callee);
return L.getAsFunctionDecl();
diff --git a/clang/test/Analysis/NewDelete-checker-test.cpp b/clang/test/Analysis/NewDelete-checker-test.cpp
index 5a8711fa8a7ad..86df9d01dfb01 100644
--- a/clang/test/Analysis/NewDelete-checker-test.cpp
+++ b/clang/test/Analysis/NewDelete-checker-test.cpp
@@ -421,3 +421,36 @@ void shouldNotReportLeak() {
Derived *p = (Derived *)allocate();
delete p;
}
+
+template<void *allocate_fn(size_t)>
+void* allocate_via_nttp(size_t n) {
+ return allocate_fn(n);
+}
+
+template<void deallocate_fn(void*)>
+void deallocate_via_nttp(void* ptr) {
+ deallocate_fn(ptr);
+}
+
+void testNTTPNewNTTPDelete() {
+ void* p = allocate_via_nttp<::operator new>(10);
+ deallocate_via_nttp<::operator delete>(p);
+} // no warn
+
+void testNTTPNewDirectDelete() {
+ void* p = allocate_via_nttp<::operator new>(10);
+ ::operator delete(p);
+} // no warn
+
+void testDirectNewNTTPDelete() {
+ void* p = ::operator new(10);
+ deallocate_via_nttp<::operator delete>(p);
+}
+
+void not_free(void*) {
+}
+
+void testLeakBecauseNTTPIsNotDeallocation() {
+ void* p = ::operator new(10);
+ deallocate_via_nttp<not_free>(p);
+} // leak-warning{{Potential leak of memory pointed to by 'p'}}
More information about the cfe-commits
mailing list