Skip to content

Commit 0cb981d

Browse files
committed
[fix] Fix AlphaEquivalenceSolver
1 parent 200db1d commit 0cb981d

File tree

3 files changed

+28
-9
lines changed

3 files changed

+28
-9
lines changed

include/klee/Expr/AlphaBuilder.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ class AlphaBuilder final : public ExprVisitor {
3535
AlphaBuilder(ArrayCache &_arrayCache);
3636
constraints_ty visitConstraints(constraints_ty cs);
3737
ref<Expr> build(ref<Expr> v);
38+
const Array *buildArray(const Array *arr) { return visitArray(arr); }
3839
};
3940

4041
} // namespace klee

lib/Solver/AlphaEquivalenceSolver.cpp

Lines changed: 6 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ class AlphaEquivalenceSolver : public SolverImpl {
5757
const ExprHashMap<ref<Expr>> &reverse);
5858
std::vector<const Array *>
5959
changeVersion(const std::vector<const Array *> &objects,
60-
const ArrayCache::ArrayHashMap<const Array *> &reverse);
60+
AlphaBuilder &builder);
6161
Assignment
6262
changeVersion(const std::vector<const Array *> &objects,
6363
const std::vector<SparseStorage<unsigned char>> &values,
@@ -99,14 +99,12 @@ Assignment AlphaEquivalenceSolver::changeVersion(
9999
return Assignment(reverseObjects, reverseValues);
100100
}
101101

102-
std::vector<const Array *> AlphaEquivalenceSolver::changeVersion(
103-
const std::vector<const Array *> &objects,
104-
const ArrayCache::ArrayHashMap<const Array *> &reverse) {
102+
std::vector<const Array *>
103+
AlphaEquivalenceSolver::changeVersion(const std::vector<const Array *> &objects,
104+
AlphaBuilder &builder) {
105105
std::vector<const Array *> reverseObjects;
106106
for (size_t i = 0; i < objects.size(); i++) {
107-
if (reverse.count(objects.at(i)) != 0) {
108-
reverseObjects.push_back(reverse.at(objects.at(i)));
109-
}
107+
reverseObjects.push_back(builder.buildArray(objects.at(i)));
110108
}
111109
return reverseObjects;
112110
}
@@ -187,8 +185,7 @@ bool AlphaEquivalenceSolver::computeInitialValues(
187185
AlphaBuilder builder(arrayCache);
188186
constraints_ty alphaQuery = builder.visitConstraints(query.constraints.cs());
189187
ref<Expr> alphaQueryExpr = builder.build(query.expr);
190-
const std::vector<const Array *> newObjects =
191-
changeVersion(objects, builder.alphaArrayMap);
188+
const std::vector<const Array *> newObjects = changeVersion(objects, builder);
192189

193190
if (!solver->impl->computeInitialValues(
194191
Query(ConstraintSet(alphaQuery, {}, {}), alphaQueryExpr, query.id),
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
// RUN: %clang %s -emit-llvm %O0opt -c -o %t.bc
2+
// RUN: rm -rf %t.klee-out
3+
// RUN: %klee --debug-assignment-validating-solver=false --use-fast-cex-solver=false --use-cex-cache=false --use-branch-cache=false --use-alpha-equivalence=true --use-independent-solver=false --use-concretizing-solver=false --output-dir=%t.klee-out --skip-not-symbolic-objects --use-timestamps=false --use-guided-search=none %t.bc
4+
5+
#include <assert.h>
6+
7+
struct Node {
8+
int *x;
9+
};
10+
11+
int main() {
12+
struct Node *nodeA;
13+
struct Node *nodeB;
14+
klee_make_symbolic(&nodeA, sizeof(nodeA), "nodeA");
15+
klee_make_symbolic(&nodeB, sizeof(nodeB), "nodeB");
16+
17+
if (nodeA && nodeB && nodeA == nodeB && (*nodeA->x * 2) != (*nodeA->x + *nodeB->x)) {
18+
assert(0);
19+
}
20+
return 0;
21+
}

0 commit comments

Comments
 (0)