[PATCH] D128716: [analyzer] Fix BindingDecl evaluation for reference types.
Domján Dániel via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Wed Jun 29 04:01:52 PDT 2022
This revision was automatically updated to reflect the committed changes.
Closed by commit rG9d2e830737bc: [analyzer] Fix BindingDecl evaluation for reference types (authored by isuckatcs).
Herald added a project: clang.
Herald added a subscriber: cfe-commits.
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D128716/new/
https://reviews.llvm.org/D128716
Files:
clang/lib/StaticAnalyzer/Core/ExprEngine.cpp
clang/test/Analysis/structured_bindings.cpp
Index: clang/test/Analysis/structured_bindings.cpp
===================================================================
--- clang/test/Analysis/structured_bindings.cpp
+++ clang/test/Analysis/structured_bindings.cpp
@@ -1,9 +1,32 @@
-// RUN: %clang_analyze_cc1 -std=c++17 -analyzer-checker=core -verify %s
+// RUN: %clang_analyze_cc1 -std=c++17 -analyzer-checker=core,debug.ExprInspection -verify %s
+
+void clang_analyzer_eval(bool);
struct s { int a; };
int foo() {
- auto[a] = s{1}; // FIXME: proper modelling
- if (a) {
- }
+ auto [a] = s{1};
+ clang_analyzer_eval(a == 1); // expected-warning{{TRUE}}
} // expected-warning{{non-void function does not return a value}}
+struct s2 {
+ int &x;
+};
+
+int *foo2(s2 in) {
+ auto [a] = in;
+ return &a;
+}
+
+void bar() {
+ int i = 1;
+ s2 a{i};
+
+ auto *x = foo2(a);
+
+ clang_analyzer_eval(*x == i); // expected-warning{{TRUE}}
+
+ *x = 2;
+
+ clang_analyzer_eval(*x == 2); // expected-warning{{TRUE}}
+ clang_analyzer_eval(i == 2); // expected-warning{{TRUE}}
+}
Index: clang/lib/StaticAnalyzer/Core/ExprEngine.cpp
===================================================================
--- clang/lib/StaticAnalyzer/Core/ExprEngine.cpp
+++ clang/lib/StaticAnalyzer/Core/ExprEngine.cpp
@@ -2630,6 +2630,9 @@
} else
llvm_unreachable("An unknown case of structured binding encountered!");
+ if (BD->getType()->isReferenceType())
+ V = state->getSVal(V.getAsRegion());
+
Bldr.generateNode(Ex, Pred, state->BindExpr(Ex, LCtx, V), nullptr,
ProgramPoint::PostLValueKind);
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D128716.440928.patch
Type: text/x-patch
Size: 1594 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20220629/3b16146d/attachment.bin>
More information about the cfe-commits
mailing list