@@ -6,7 +6,7 @@ var tmp = require('tmp');
6
6
var potentialSolvers = [
7
7
{
8
8
name : 'z3' ,
9
- params : ''
9
+ params : '-smt2 '
10
10
} ,
11
11
{
12
12
name : 'cvc4' ,
@@ -20,17 +20,36 @@ function solve (query) {
20
20
throw new Error ( 'No SMT solver available. Assertion checking will not be performed.' ) ;
21
21
}
22
22
23
- var tmpFile = tmp . fileSync ( ) ;
23
+ var tmpFile = tmp . fileSync ( { postfix : '.smt2' } ) ;
24
24
fs . writeFileSync ( tmpFile . name , query ) ;
25
25
// TODO For now only the first SMT solver found is used.
26
26
// At some point a computation similar to the one done in
27
27
// SMTPortfolio::check should be performed, where the results
28
28
// given by different solvers are compared and an error is
29
29
// reported if solvers disagree (i.e. SAT vs UNSAT).
30
- var solverOutput = execSync ( solvers [ 0 ] . name + ' ' + solvers [ 0 ] . params + ' ' + tmpFile . name ) ;
30
+ var solverOutput ;
31
+ try {
32
+ solverOutput = execSync (
33
+ solvers [ 0 ] . name + ' ' + solvers [ 0 ] . params + ' ' + tmpFile . name , {
34
+ timeout : 10000
35
+ }
36
+ ) . toString ( ) ;
37
+ } catch ( e ) {
38
+ // execSync throws if the process times out or returns != 0.
39
+ // The latter might happen with z3 if the query asks for a model
40
+ // for an UNSAT formula. We can still use stdout.
41
+ solverOutput = e . stdout . toString ( ) ;
42
+ if (
43
+ ! solverOutput . startsWith ( 'sat' ) &&
44
+ ! solverOutput . startsWith ( 'unsat' ) &&
45
+ ! solverOutput . startsWith ( 'unknown' )
46
+ ) {
47
+ throw new Error ( 'Failed solve SMT query. ' + e . toString ( ) ) ;
48
+ }
49
+ }
31
50
// Trigger early manual cleanup
32
51
tmpFile . removeCallback ( ) ;
33
- return solverOutput . toString ( ) ;
52
+ return solverOutput ;
34
53
}
35
54
36
55
module . exports = {
0 commit comments