aboutsummaryrefslogtreecommitdiff
path: root/clang
diff options
context:
space:
mode:
authorExile <2094247798@qq.com>2024-03-07 00:01:30 +0800
committerTom Stellard <tstellar@redhat.com>2024-03-12 21:53:55 -0700
commit1de8ea75d9b309fd14e9f1be86ea5079d9a53d69 (patch)
tree29e181f63e280e134ef80de9b23e2670b02d511d /clang
parentc14bf0a13d426b0b8fc2bc395bf450d9a6982fe3 (diff)
downloadllvm-1de8ea75d9b309fd14e9f1be86ea5079d9a53d69.zip
llvm-1de8ea75d9b309fd14e9f1be86ea5079d9a53d69.tar.gz
llvm-1de8ea75d9b309fd14e9f1be86ea5079d9a53d69.tar.bz2
[analyzer] Fix crash on dereference invalid return value of getAdjustedParameterIndex() (#83585)
Fixes #78810 Thanks for Snape3058 's comment --------- Co-authored-by: miaozhiyuan <miaozhiyuan@feysh.com> (cherry picked from commit d4687fe7d1639ea5d16190c89a54de1f2c6e2a9a)
Diffstat (limited to 'clang')
-rw-r--r--clang/lib/StaticAnalyzer/Core/CallEvent.cpp2
-rw-r--r--clang/test/Analysis/cxx2b-deducing-this.cpp11
2 files changed, 12 insertions, 1 deletions
diff --git a/clang/lib/StaticAnalyzer/Core/CallEvent.cpp b/clang/lib/StaticAnalyzer/Core/CallEvent.cpp
index 0ac1d91..bc14aea 100644
--- a/clang/lib/StaticAnalyzer/Core/CallEvent.cpp
+++ b/clang/lib/StaticAnalyzer/Core/CallEvent.cpp
@@ -1409,7 +1409,7 @@ CallEventManager::getSimpleCall(const CallExpr *CE, ProgramStateRef State,
if (const auto *OpCE = dyn_cast<CXXOperatorCallExpr>(CE)) {
const FunctionDecl *DirectCallee = OpCE->getDirectCallee();
if (const auto *MD = dyn_cast<CXXMethodDecl>(DirectCallee))
- if (MD->isInstance())
+ if (MD->isImplicitObjectMemberFunction())
return create<CXXMemberOperatorCall>(OpCE, State, LCtx, ElemRef);
} else if (CE->getCallee()->getType()->isBlockPointerType()) {
diff --git a/clang/test/Analysis/cxx2b-deducing-this.cpp b/clang/test/Analysis/cxx2b-deducing-this.cpp
index d22a897..2ec9e96 100644
--- a/clang/test/Analysis/cxx2b-deducing-this.cpp
+++ b/clang/test/Analysis/cxx2b-deducing-this.cpp
@@ -60,3 +60,14 @@ void top() {
s.c();
s.c(11);
}
+
+
+struct S2 {
+ bool operator==(this auto, S2) {
+ return true;
+ }
+};
+void use_deducing_this() {
+ int result = S2{} == S2{}; // no-crash
+ clang_analyzer_dump(result); // expected-warning {{1 S32b}}
+}