- Added '--max-depth=X' switch (which is equal to the old '-l X -a')
- Modified semantics of -l with -a : this corresponds more to the intuition and introduces the new option to prune proofs based on trace length.
This commit is contained in:
parent
4f36181c3c
commit
b56c01c422
@ -1876,18 +1876,51 @@ prune_bounds ()
|
|||||||
Termlist tl;
|
Termlist tl;
|
||||||
List bl;
|
List bl;
|
||||||
|
|
||||||
if (proofDepth > sys->switch_maxtracelength)
|
/* prune for proof depth */
|
||||||
|
if (proofDepth > sys->switch_maxproofdepth)
|
||||||
{
|
{
|
||||||
// Hardcoded limit on proof tree depth
|
// Hardcoded limit on proof tree depth
|
||||||
if (sys->output == PROOF)
|
if (sys->output == PROOF)
|
||||||
{
|
{
|
||||||
indentPrint ();
|
indentPrint ();
|
||||||
eprintf ("Pruned: proof tree too deep: %i (-l %i switch)\n",
|
eprintf ("Pruned: proof tree too deep: %i (--max-depth %i switch)\n",
|
||||||
proofDepth, sys->switch_maxtracelength);
|
proofDepth, sys->switch_maxproofdepth);
|
||||||
}
|
}
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* prune for trace length */
|
||||||
|
if (sys->switch_maxtracelength < INT_MAX)
|
||||||
|
{
|
||||||
|
int tracelength;
|
||||||
|
int run;
|
||||||
|
|
||||||
|
/* compute trace length of current semistate */
|
||||||
|
tracelength = 0;
|
||||||
|
run = 0;
|
||||||
|
while (run < sys->maxruns)
|
||||||
|
{
|
||||||
|
/* ignore intruder actions */
|
||||||
|
if (sys->runs[run].protocol != INTRUDER)
|
||||||
|
{
|
||||||
|
tracelength = tracelength + sys->runs[run].step;
|
||||||
|
}
|
||||||
|
run++;
|
||||||
|
}
|
||||||
|
/* test */
|
||||||
|
if (tracelength > sys->switch_maxtracelength)
|
||||||
|
{
|
||||||
|
// Hardcoded limit on proof tree depth
|
||||||
|
if (sys->output == PROOF)
|
||||||
|
{
|
||||||
|
indentPrint ();
|
||||||
|
eprintf ("Pruned: trace too long: %i (-l %i switch)\n",
|
||||||
|
tracelength, sys->switch_maxtracelength);
|
||||||
|
}
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (num_regular_runs > sys->switchRuns)
|
if (num_regular_runs > sys->switchRuns)
|
||||||
{
|
{
|
||||||
// Hardcoded limit on runs
|
// Hardcoded limit on runs
|
||||||
|
@ -117,7 +117,10 @@ main (int argc, char **argv)
|
|||||||
"pruning method (default is 2)");
|
"pruning method (default is 2)");
|
||||||
struct arg_int *switch_prune_trace_length =
|
struct arg_int *switch_prune_trace_length =
|
||||||
arg_int0 ("l", "max-length", NULL,
|
arg_int0 ("l", "max-length", NULL,
|
||||||
"prune traces longer than <int> events, prune proof deeper than <int> splits.");
|
"prune traces longer than <int> events.");
|
||||||
|
struct arg_int *switch_prune_proof_depth =
|
||||||
|
arg_int0 (NULL, "max-depth", NULL,
|
||||||
|
"prune proof deeper than <int> splits.");
|
||||||
struct arg_lit *switch_incremental_trace_length =
|
struct arg_lit *switch_incremental_trace_length =
|
||||||
arg_lit0 (NULL, "increment-traces",
|
arg_lit0 (NULL, "increment-traces",
|
||||||
"incremental search using the length of the traces.");
|
"incremental search using the length of the traces.");
|
||||||
@ -187,6 +190,7 @@ main (int argc, char **argv)
|
|||||||
switch_match_method,
|
switch_match_method,
|
||||||
switch_clp,
|
switch_clp,
|
||||||
switch_pruning_method,
|
switch_pruning_method,
|
||||||
|
switch_prune_proof_depth,
|
||||||
switch_prune_trace_length, switch_incremental_trace_length,
|
switch_prune_trace_length, switch_incremental_trace_length,
|
||||||
switch_maximum_runs, switch_incremental_runs,
|
switch_maximum_runs, switch_incremental_runs,
|
||||||
|
|
||||||
@ -229,6 +233,7 @@ main (int argc, char **argv)
|
|||||||
switch_traversal_method->ival[0] = 12;
|
switch_traversal_method->ival[0] = 12;
|
||||||
switch_match_method->ival[0] = 0;
|
switch_match_method->ival[0] = 0;
|
||||||
switch_prune_trace_length->ival[0] = -1;
|
switch_prune_trace_length->ival[0] = -1;
|
||||||
|
switch_prune_proof_depth->ival[0] = -1;
|
||||||
switch_maximum_runs->ival[0] = INT_MAX;
|
switch_maximum_runs->ival[0] = INT_MAX;
|
||||||
switch_pruning_method->ival[0] = 2;
|
switch_pruning_method->ival[0] = 2;
|
||||||
|
|
||||||
@ -524,6 +529,8 @@ main (int argc, char **argv)
|
|||||||
}
|
}
|
||||||
if (switch_empty->count > 0)
|
if (switch_empty->count > 0)
|
||||||
sys->output = EMPTY;
|
sys->output = EMPTY;
|
||||||
|
if (switch_prune_proof_depth->ival[0] >= 0)
|
||||||
|
sys->switch_maxproofdepth = switch_prune_proof_depth->ival[0];
|
||||||
if (switch_prune_trace_length->ival[0] >= 0)
|
if (switch_prune_trace_length->ival[0] >= 0)
|
||||||
sys->switch_maxtracelength = switch_prune_trace_length->ival[0];
|
sys->switch_maxtracelength = switch_prune_trace_length->ival[0];
|
||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
|
@ -78,6 +78,7 @@ systemInit ()
|
|||||||
/* set illegal traversal by default, to make sure it is set
|
/* set illegal traversal by default, to make sure it is set
|
||||||
later */
|
later */
|
||||||
sys->traverse = 0;
|
sys->traverse = 0;
|
||||||
|
sys->switch_maxproofdepth = INT_MAX;
|
||||||
sys->switch_maxtracelength = INT_MAX;
|
sys->switch_maxtracelength = INT_MAX;
|
||||||
sys->maxtracelength = INT_MAX;
|
sys->maxtracelength = INT_MAX;
|
||||||
|
|
||||||
|
@ -122,7 +122,8 @@ struct system
|
|||||||
int output; //!< From enum outputs: what should be produced. Default ATTACK.
|
int output; //!< From enum outputs: what should be produced. Default ATTACK.
|
||||||
int report;
|
int report;
|
||||||
int prune; //!< Type of pruning.
|
int prune; //!< Type of pruning.
|
||||||
int switch_maxtracelength; //!< Helps to remember the length of the last trace.
|
int switch_maxproofdepth; //!< Maximum proof depth
|
||||||
|
int switch_maxtracelength; //!< Maximum trace length allowed
|
||||||
int maxtracelength; //!< helps to remember the length of the last trace.
|
int maxtracelength; //!< helps to remember the length of the last trace.
|
||||||
int switchM; //!< Memory display switch.
|
int switchM; //!< Memory display switch.
|
||||||
int switchT; //!< Time display switch.
|
int switchT; //!< Time display switch.
|
||||||
|
Loading…
Reference in New Issue
Block a user