@@ -180,8 +180,8 @@ class TypeSolverTest {
180
180
val a = ctx.mkRegisterReading(0 , addressSort)
181
181
val b1 = ctx.mkRegisterReading(1 , addressSort)
182
182
val b2 = ctx.mkRegisterReading(2 , addressSort)
183
-
184
183
val c = ctx.mkRegisterReading(3 , addressSort)
184
+
185
185
pc + = mkHeapRefEq(a, nullRef).not () and
186
186
mkHeapRefEq(b1, nullRef).not () and
187
187
mkHeapRefEq(b2, nullRef).not () and
@@ -226,6 +226,39 @@ class TypeSolverTest {
226
226
}
227
227
}
228
228
229
+ @Test
230
+ fun `Test symbolic ref -- expressions to assert correctness about null` (): Unit = with (ctx) {
231
+ val a = ctx.mkRegisterReading(0 , addressSort)
232
+ val b = ctx.mkRegisterReading(1 , addressSort)
233
+ val c = ctx.mkRegisterReading(2 , addressSort)
234
+
235
+ pc + = mkIsExpr(a, interfaceAB)
236
+ pc + = mkIsExpr(b, interfaceBC1)
237
+ pc + = mkIsExpr(c, interfaceAC)
238
+
239
+ // it's overcomplicated a == c && b == c
240
+ pc + = (mkHeapRefEq(a, c) or mkHeapRefEq(b, c)) and (! mkHeapRefEq(a, c) or ! mkHeapRefEq(b, c)).not ()
241
+
242
+ val resultBeforeNotNullConstraints = solver.check(pc, useSoftConstraints = false )
243
+ val model = assertIs<USatResult <UModelBase <Field , TestType >>>(resultBeforeNotNullConstraints).model
244
+
245
+ assertIs<USatResult <UModelBase <Field , TestType >>>(resultBeforeNotNullConstraints)
246
+
247
+ val concreteA = assertIs<UConcreteHeapRef >(model.eval(a)).address
248
+ val concreteB = assertIs<UConcreteHeapRef >(model.eval(b)).address
249
+ val concreteC = assertIs<UConcreteHeapRef >(model.eval(c)).address
250
+
251
+ val someIsNull = concreteA == 0 || concreteB == 0 || concreteC == 0
252
+ val aEqualsCOrBEqualsC = concreteA == concreteC || concreteB == concreteC
253
+ assertTrue(someIsNull && aEqualsCOrBEqualsC)
254
+
255
+ pc + = mkOrNoSimplify(mkHeapRefEq(a, nullRef).not (), falseExpr)
256
+ pc + = mkOrNoSimplify(mkHeapRefEq(b, nullRef).not (), falseExpr)
257
+
258
+ val resultWithNotNullConstraints = solver.check(pc, useSoftConstraints = false )
259
+ assertIs<UUnsatResult <UModelBase <Field , TestType >>>(resultWithNotNullConstraints)
260
+ }
261
+
229
262
@Test
230
263
@Disabled(" Support propositional type variables" )
231
264
fun `Test symbolic ref -- not instance of constraint` (): Unit = with (ctx) {
0 commit comments