[PATCH] D103025: [analyzer] Handle NTTP invocation in CallContext.getCalleeDecl()
Valeriy Savchenko via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Fri Jun 18 06:46:24 PDT 2021
This revision was automatically updated to reflect the committed changes.
Closed by commit rGcc2ef1955609: [analyzer] Handle NTTP invocation in CallContext.getCalleeDecl() (authored by tomasz-kaminski-sonarsource, committed by vsavchenko).
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D103025/new/
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();
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D103025.352998.patch
Type: text/x-patch
Size: 1653 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20210618/dca1d3c7/attachment.bin>
More information about the cfe-commits
mailing list