diff options
author | Exile <2094247798@qq.com> | 2024-03-07 00:01:30 +0800 |
---|---|---|
committer | Tom Stellard <tstellar@redhat.com> | 2024-03-12 21:53:55 -0700 |
commit | 1de8ea75d9b309fd14e9f1be86ea5079d9a53d69 (patch) | |
tree | 29e181f63e280e134ef80de9b23e2670b02d511d /clang | |
parent | c14bf0a13d426b0b8fc2bc395bf450d9a6982fe3 (diff) | |
download | llvm-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.cpp | 2 | ||||
-rw-r--r-- | clang/test/Analysis/cxx2b-deducing-this.cpp | 11 |
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}} +} |