aboutsummaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
authorLuc Van Oostenryck <luc.vanoostenryck@gmail.com>2021-04-09 18:03:58 +0200
committerLuc Van Oostenryck <luc.vanoostenryck@gmail.com>2021-04-13 18:25:43 +0200
commitd1ab4c40982ffcfadebf3155f498469aeb1355b0 (patch)
tree3f1706a1471099852e748c2604970edde8955d04
parent7a9fab6984f7bce3fd52809ecf6e21b79f115be3 (diff)
downloadsparse-d1ab4c40982ffcfadebf3155f498469aeb1355b0.tar.gz
scheck: assert_eq()
Testing the equivalence of two sub-expressions can be done with with a single assertion like __assert(A == B). However, in some cases, Sparse can use the equality to simplify the whole expression although it's unable to simplify one of the two sub-expressions into the other. So, add a new assertion, __assert_eq(), testing the equality of the two expressions given in argument independently of each other. Signed-off-by: Luc Van Oostenryck <luc.vanoostenryck@gmail.com>
-rw-r--r--ident-list.h1
-rw-r--r--scheck.c11
-rw-r--r--validation/scheck/ok.c5
3 files changed, 17 insertions, 0 deletions
diff --git a/ident-list.h b/ident-list.h
index 918f54d7..ab5bc5f5 100644
--- a/ident-list.h
+++ b/ident-list.h
@@ -80,6 +80,7 @@ IDENT(main);
/* used by the symbolic checker */
IDENT(__assert);
+IDENT(__assert_eq);
#undef __IDENT
#undef IDENT
diff --git a/scheck.c b/scheck.c
index 63cbfa2d..c64e8651 100644
--- a/scheck.c
+++ b/scheck.c
@@ -32,6 +32,7 @@
#define dyntype incomplete_ctype
static const struct builtin_fn builtins_scheck[] = {
{ "__assert", &void_ctype, 0, { &bool_ctype }, .op = &generic_int_op },
+ { "__assert_eq", &void_ctype, 0, { &dyntype, &dyntype }, .op = &generic_int_op },
{}
};
@@ -224,6 +225,14 @@ static bool check_assert(Btor *btor, struct instruction *insn)
return check_btor(btor, n, insn);
}
+static bool check_equal(Btor *btor, struct instruction *insn)
+{
+ BoolectorNode *a = get_arg(btor, insn, 0);
+ BoolectorNode *b = get_arg(btor, insn, 1);
+ BoolectorNode *n = boolector_eq(btor, a, b);
+ return check_btor(btor, n, insn);
+}
+
static bool check_call(Btor *btor, struct instruction *insn)
{
pseudo_t func = insn->func;
@@ -231,6 +240,8 @@ static bool check_call(Btor *btor, struct instruction *insn)
if (ident == &__assert_ident)
return check_assert(btor, insn);
+ if (ident == &__assert_eq_ident)
+ return check_equal(btor, insn);
return 0;
}
diff --git a/validation/scheck/ok.c b/validation/scheck/ok.c
index 113912e0..76c04c4f 100644
--- a/validation/scheck/ok.c
+++ b/validation/scheck/ok.c
@@ -3,6 +3,11 @@ static void ok(int x)
__assert((~x) == (~0 - x)); // true but not simplified yet
}
+static void also_ok(int x)
+{
+ __assert_eq(~x, ~0 - x);
+}
+
static void always(int x)
{
__assert((x - x) == 0); // true and simplified