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'}} _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits