[clang] [clang][dataflow] Fix bug in `Value` comparison. (PR #76746)
via cfe-commits
cfe-commits at lists.llvm.org
Tue Jan 2 11:29:03 PST 2024
llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-clang-analysis
Author: Yitzhak Mandelbaum (ymand)
<details>
<summary>Changes</summary>
Makes value equivalence require that the values have no properties, except in
the case of equivalence by pointer equality (if the pointers are equal, nothing
else is checked).
Fixes issue #<!-- -->76459.
---
Full diff: https://github.com/llvm/llvm-project/pull/76746.diff
2 Files Affected:
- (modified) clang/lib/Analysis/FlowSensitive/Value.cpp (+7-3)
- (modified) clang/unittests/Analysis/FlowSensitive/ValueTest.cpp (+2-2)
``````````diff
diff --git a/clang/lib/Analysis/FlowSensitive/Value.cpp b/clang/lib/Analysis/FlowSensitive/Value.cpp
index 349f873f1e6c4d..50475ef5553036 100644
--- a/clang/lib/Analysis/FlowSensitive/Value.cpp
+++ b/clang/lib/Analysis/FlowSensitive/Value.cpp
@@ -27,9 +27,13 @@ static bool areEquivalentIndirectionValues(const Value &Val1,
}
bool areEquivalentValues(const Value &Val1, const Value &Val2) {
- return &Val1 == &Val2 || (Val1.getKind() == Val2.getKind() &&
- (isa<TopBoolValue>(&Val1) ||
- areEquivalentIndirectionValues(Val1, Val2)));
+ // If values are distinct and have properties, we don't consider them equal,
+ // leaving equality up to the user model.
+ return &Val1 == &Val2 ||
+ (Val1.getKind() == Val2.getKind() &&
+ // (Val1.properties().empty() && Val2.properties().empty()) &&
+ (isa<TopBoolValue>(&Val1) ||
+ areEquivalentIndirectionValues(Val1, Val2)));
}
raw_ostream &operator<<(raw_ostream &OS, const Value &Val) {
diff --git a/clang/unittests/Analysis/FlowSensitive/ValueTest.cpp b/clang/unittests/Analysis/FlowSensitive/ValueTest.cpp
index c5d18ba74c3ed6..2060b7eb264f74 100644
--- a/clang/unittests/Analysis/FlowSensitive/ValueTest.cpp
+++ b/clang/unittests/Analysis/FlowSensitive/ValueTest.cpp
@@ -53,8 +53,8 @@ TEST(ValueTest, EquivalentValuesWithDifferentPropsEquivalent) {
TopBoolValue V2(A.makeAtomRef(Atom(3)));
V1.setProperty("foo", Prop1);
V2.setProperty("bar", Prop2);
- EXPECT_TRUE(areEquivalentValues(V1, V2));
- EXPECT_TRUE(areEquivalentValues(V2, V1));
+ EXPECT_FALSE(areEquivalentValues(V1, V2));
+ EXPECT_FALSE(areEquivalentValues(V2, V1));
}
TEST(ValueTest, DifferentKindsNotEquivalent) {
``````````
</details>
https://github.com/llvm/llvm-project/pull/76746
More information about the cfe-commits
mailing list