Skip to content

Commit 2f5f90e

Browse files
committed
Add SMT Unknown Error
1 parent 0472025 commit 2f5f90e

5 files changed

Lines changed: 38 additions & 19 deletions

File tree

liquidjava-example/src/main/java/testSuite/CorrectPrimitiveNumbersTypes.java renamed to liquidjava-example/src/main/java/testSuite/ErrorPrimitiveNumbersTypes.java

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,25 +3,25 @@
33
import liquidjava.specification.Refinement;
44

55
@SuppressWarnings("unused")
6-
public class CorrectPrimitiveNumbersTypes {
6+
public class ErrorPrimitiveNumbersTypes {
77
@Refinement("_ < i && _ > 0")
88
private static double fromType(@Refinement("_ > 0") int i) {
9-
return i * 0.1;
9+
return i * 0.1; // Expect: SMT Unknown Error
1010
}
1111

1212
@Refinement(" _ < i && _ > 0")
1313
private static double fromType(@Refinement("_ > 0") long i) {
14-
return i * 0.1;
14+
return i * 0.1; // Expect: SMT Unknown Error
1515
}
1616

1717
@Refinement(" _ < i && _ > 0")
1818
private static double fromType(@Refinement("_ > 0") short i) {
19-
return i * 0.1;
19+
return i * 0.1; // Expect: SMT Unknown Error
2020
}
2121

2222
@Refinement("_ > i")
2323
private static float twice(@Refinement("i > 0") short i) {
24-
return i * 2f;
24+
return i * 2f; // Expect: SMT Unknown Error
2525
}
2626

2727
public static void main(String[] args) {
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
package testSuite;
2+
3+
import liquidjava.specification.Refinement;
4+
5+
public class ErrorSMTUnknown {
6+
@Refinement("_ > 2.0")
7+
public static int aboveTwo(int value) {
8+
return value; // Expect: SMT Unknown Error
9+
}
10+
}

‎liquidjava-verifier/src/main/java/liquidjava/diagnostics/DebugLog.java‎

Lines changed: 2 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@
2121
* <ul>
2222
* <li>{@link #info} — verification context (caller-level predicates, source position).</li>
2323
* <li>{@link #smtStart} — premises and conclusion as fed to Z3.</li>
24-
* <li>{@link #smtUnsat} / {@link #smtSat} / {@link #smtUnknown} — solver outcome.</li>
24+
* <li>{@link #smtUnsat} / {@link #smtSat} / {@link #smtError} — solver outcome.</li>
2525
* </ul>
2626
*/
2727
public final class DebugLog {
@@ -400,16 +400,9 @@ private static String formatCounterexample(Object counterexample) {
400400
return sb.toString();
401401
}
402402

403-
public static void smtUnknown() {
404-
if (!enabled()) {
405-
return;
406-
}
407-
System.out.println(SMT_TAG + " Result: " + Colors.YELLOW + "UNKNOWN (treated as OK)" + Colors.RESET);
408-
}
409-
410403
/**
411404
* Print the result of an SMT check whose {@code smtStart} was emitted by the caller (e.g. VCChecker's structured
412-
* print). {@link liquidjava.smt.SMTResult} doesn't preserve UNKNOWN, so this maps OK → UNSAT and ERROR → SAT.
405+
* print). This maps OK → UNSAT and ERROR → SAT; UNKNOWN raises an error instead of returning a result.
413406
*/
414407
public static void smtResult(liquidjava.smt.SMTResult result) {
415408
if (!enabled()) {
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
package liquidjava.diagnostics.errors;
2+
3+
/**
4+
* Error indicating that the SMT solver could not decide a verification condition
5+
*/
6+
public class SMTUnknownError extends LJError {
7+
8+
public SMTUnknownError(String reason) {
9+
super("SMT Unknown Error",
10+
"The SMT solver returned UNKNOWN and could not verify the refinement. Reason: " + reason, null, null);
11+
}
12+
}

‎liquidjava-verifier/src/main/java/liquidjava/smt/SMTEvaluator.java‎

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
import com.microsoft.z3.Z3Exception;
99

1010
import liquidjava.diagnostics.DebugLog;
11+
import liquidjava.diagnostics.errors.SMTUnknownError;
1112
import liquidjava.processor.context.Context;
1213
import liquidjava.rj_language.Predicate;
1314
import liquidjava.rj_language.ast.Expression;
@@ -51,12 +52,15 @@ public SMTResult verifySubtype(Predicate subRef, Predicate supRef, Context conte
5152
}
5253
return SMTResult.error(counterexample);
5354
}
54-
if (!silent) {
55-
if (result.equals(Status.UNKNOWN)) {
56-
DebugLog.smtUnknown();
57-
} else {
58-
DebugLog.smtUnsat();
55+
if (result.equals(Status.UNKNOWN)) {
56+
SMTUnknownError error = new SMTUnknownError(solver.getReasonUnknown());
57+
if (!silent) {
58+
DebugLog.smtError(error.getMessage());
5959
}
60+
throw error;
61+
}
62+
if (!silent) {
63+
DebugLog.smtUnsat();
6064
}
6165
}
6266
} catch (SyntaxException e) {

0 commit comments

Comments
 (0)