tomasz-kaminski-sonarsource created this revision. tomasz-kaminski-sonarsource added reviewers: NoQ, vsavchenko, steakhal. Herald added subscribers: manas, ASDenysPetrov, martong, dkrupp, donat.nagy, Szelethus, mikhail.ramalho, a.sidorin, szepet, baloghadamsoftware, xazax.hun. tomasz-kaminski-sonarsource requested review of this revision. Herald added a project: clang. Herald added a subscriber: cfe-commits.
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(). Repository: rG LLVM Github Monorepo https://reviews.llvm.org/D103025 Files: clang/lib/StaticAnalyzer/Core/CheckerContext.cpp clang/test/Analysis/NewDelete-checker-test.cpp Index: clang/test/Analysis/NewDelete-checker-test.cpp =================================================================== --- clang/test/Analysis/NewDelete-checker-test.cpp +++ clang/test/Analysis/NewDelete-checker-test.cpp @@ -421,3 +421,36 @@ 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'}} Index: clang/lib/StaticAnalyzer/Core/CheckerContext.cpp =================================================================== --- clang/lib/StaticAnalyzer/Core/CheckerContext.cpp +++ clang/lib/StaticAnalyzer/Core/CheckerContext.cpp @@ -19,6 +19,10 @@ 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();
Index: clang/test/Analysis/NewDelete-checker-test.cpp =================================================================== --- clang/test/Analysis/NewDelete-checker-test.cpp +++ clang/test/Analysis/NewDelete-checker-test.cpp @@ -421,3 +421,36 @@ 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'}} Index: clang/lib/StaticAnalyzer/Core/CheckerContext.cpp =================================================================== --- clang/lib/StaticAnalyzer/Core/CheckerContext.cpp +++ clang/lib/StaticAnalyzer/Core/CheckerContext.cpp @@ -19,6 +19,10 @@ 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();
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits