- Added check for non-used variables.
This commit is contained in:
parent
397298290b
commit
ca4c5674ac
107
src/arachne.c
107
src/arachne.c
@ -3491,65 +3491,70 @@ arachne ()
|
||||
if (switches.filterClaim == NULL
|
||||
|| switches.filterClaim == cl->type)
|
||||
{
|
||||
int run;
|
||||
Protocol p;
|
||||
Role r;
|
||||
|
||||
sys->current_claim = cl;
|
||||
attack_length = INT_MAX;
|
||||
attack_leastcost = INT_MAX;
|
||||
cl->complete = 1;
|
||||
p = (Protocol) cl->protocol;
|
||||
r = (Role) cl->role;
|
||||
|
||||
if (switches.output == PROOF)
|
||||
// Some claims are always true!
|
||||
if (!cl->alwaystrue)
|
||||
{
|
||||
indentPrint ();
|
||||
eprintf ("Testing Claim ");
|
||||
termPrint (cl->type);
|
||||
eprintf (" from ");
|
||||
termPrint (p->nameterm);
|
||||
eprintf (", ");
|
||||
termPrint (r->nameterm);
|
||||
eprintf (" at index %i.\n", cl->ev);
|
||||
}
|
||||
indentDepth++;
|
||||
run = semiRunCreate (p, r);
|
||||
proof_suppose_run (run, 0, cl->ev + 1);
|
||||
add_read_goals (run, 0, cl->ev + 1);
|
||||
// others we simply test...
|
||||
int run;
|
||||
Protocol p;
|
||||
Role r;
|
||||
|
||||
/**
|
||||
* Add specific goal info
|
||||
*/
|
||||
add_claim_specifics (cl,
|
||||
roledef_shift (sys->runs[run].start,
|
||||
cl->ev));
|
||||
sys->current_claim = cl;
|
||||
attack_length = INT_MAX;
|
||||
attack_leastcost = INT_MAX;
|
||||
cl->complete = 1;
|
||||
p = (Protocol) cl->protocol;
|
||||
r = (Role) cl->role;
|
||||
|
||||
if (switches.output == PROOF)
|
||||
{
|
||||
indentPrint ();
|
||||
eprintf ("Testing Claim ");
|
||||
termPrint (cl->type);
|
||||
eprintf (" from ");
|
||||
termPrint (p->nameterm);
|
||||
eprintf (", ");
|
||||
termPrint (r->nameterm);
|
||||
eprintf (" at index %i.\n", cl->ev);
|
||||
}
|
||||
indentDepth++;
|
||||
run = semiRunCreate (p, r);
|
||||
proof_suppose_run (run, 0, cl->ev + 1);
|
||||
add_read_goals (run, 0, cl->ev + 1);
|
||||
|
||||
/**
|
||||
* Add specific goal info
|
||||
*/
|
||||
add_claim_specifics (cl,
|
||||
roledef_shift (sys->runs[run].start,
|
||||
cl->ev));
|
||||
|
||||
#ifdef DEBUG
|
||||
if (DEBUGL (5))
|
||||
{
|
||||
printSemiState ();
|
||||
}
|
||||
if (DEBUGL (5))
|
||||
{
|
||||
printSemiState ();
|
||||
}
|
||||
#endif
|
||||
iterate_buffer_attacks ();
|
||||
iterate_buffer_attacks ();
|
||||
|
||||
//! Destroy
|
||||
while (sys->bindings != NULL)
|
||||
{
|
||||
goal_remove_last (1);
|
||||
}
|
||||
while (sys->maxruns > 0)
|
||||
{
|
||||
semiRunDestroy ();
|
||||
}
|
||||
//! Destroy
|
||||
while (sys->bindings != NULL)
|
||||
{
|
||||
goal_remove_last (1);
|
||||
}
|
||||
while (sys->maxruns > 0)
|
||||
{
|
||||
semiRunDestroy ();
|
||||
}
|
||||
|
||||
//! Indent back
|
||||
indentDepth--;
|
||||
//! Indent back
|
||||
indentDepth--;
|
||||
|
||||
if (switches.output == PROOF)
|
||||
{
|
||||
indentPrint ();
|
||||
eprintf ("Proof complete for this claim.\n");
|
||||
if (switches.output == PROOF)
|
||||
{
|
||||
indentPrint ();
|
||||
eprintf ("Proof complete for this claim.\n");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
132
src/compiler.c
132
src/compiler.c
@ -93,6 +93,28 @@ compilerDone (void)
|
||||
return;
|
||||
}
|
||||
|
||||
//! Compute read variables for a role
|
||||
Termlist
|
||||
compute_read_variables (const Role r)
|
||||
{
|
||||
Termlist tl;
|
||||
|
||||
int process_event (Roledef rd)
|
||||
{
|
||||
if (rd->type == READ)
|
||||
{
|
||||
tl = termlistAddVariables (tl, rd->from);
|
||||
tl = termlistAddVariables (tl, rd->to);
|
||||
tl = termlistAddVariables (tl, rd->message);
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
||||
tl = NULL;
|
||||
roledef_iterate_events (r->roledef, process_event);
|
||||
return tl;
|
||||
}
|
||||
|
||||
/* ------------------------------------------------------------------- */
|
||||
|
||||
//! Compile the tac into the system
|
||||
@ -189,6 +211,7 @@ levelDeclare (Symbol s, int isVar, int level)
|
||||
return t;
|
||||
}
|
||||
|
||||
//! Generate a term from a symbol
|
||||
Term
|
||||
symbolDeclare (Symbol s, int isVar)
|
||||
{
|
||||
@ -271,7 +294,7 @@ defineUsertype (Tac tcdu)
|
||||
{
|
||||
/* phew. warn anyway */
|
||||
globalError++;
|
||||
eprintf ("WARNING: double declaration of usertype ");
|
||||
eprintf ("warning: double declaration of usertype ");
|
||||
termPrint (tfind);
|
||||
eprintf ("\n");
|
||||
globalError--;
|
||||
@ -288,6 +311,7 @@ defineUsertype (Tac tcdu)
|
||||
}
|
||||
}
|
||||
|
||||
//! Declare a variable at the current level
|
||||
void
|
||||
levelTacDeclaration (Tac tc, int isVar)
|
||||
{
|
||||
@ -295,12 +319,14 @@ levelTacDeclaration (Tac tc, int isVar)
|
||||
Termlist typetl = NULL;
|
||||
Term t;
|
||||
|
||||
// tscan contains the type list (as is const x,z: Term or var y: Term,Ding)
|
||||
tscan = tc->t2.tac;
|
||||
if (!isVar && tscan->next != NULL)
|
||||
{
|
||||
error ("Multiple type definition for constant on line %i.",
|
||||
tscan->lineno);
|
||||
}
|
||||
// scan the whole type info list
|
||||
while (tscan != NULL && tscan->op == TAC_STRING)
|
||||
{
|
||||
/* apparently there is type info, termlist? */
|
||||
@ -322,12 +348,18 @@ levelTacDeclaration (Tac tc, int isVar)
|
||||
typetl = termlistAdd (typetl, t);
|
||||
tscan = tscan->next;
|
||||
}
|
||||
/* parse all constants and vars */
|
||||
/* parse all constants and vars, because a single declaration can contain multiple ones */
|
||||
tscan = tc->t1.tac;
|
||||
while (tscan != NULL)
|
||||
{
|
||||
/* declare this variable/constant with the previously derived type list */
|
||||
t = symbolDeclare (tscan->t1.sym, isVar);
|
||||
t->stype = typetl;
|
||||
if (isVar && level == 2)
|
||||
{
|
||||
/* it is a role variable, so add it to the nicely declared variables */
|
||||
thisRole->declaredvars = termlistAdd (thisRole->declaredvars, t);
|
||||
}
|
||||
tscan = tscan->next;
|
||||
}
|
||||
}
|
||||
@ -516,6 +548,8 @@ commEvent (int event, Tac tc)
|
||||
cl->failed = 0;
|
||||
cl->prec = NULL;
|
||||
cl->roles = NULL;
|
||||
cl->alwaystrue = false;
|
||||
cl->warnings = false;
|
||||
cl->next = sys->claimlist;
|
||||
sys->claimlist = cl;
|
||||
|
||||
@ -535,6 +569,25 @@ commEvent (int event, Tac tc)
|
||||
("Secrecy claim on line %i should not contain tuples (for Arachne) until it is officially supported.",
|
||||
trip->next->lineno);
|
||||
}
|
||||
/* now check whether the claim contains variables that can actually be influenced by the intruder */
|
||||
{
|
||||
Termlist claimvars;
|
||||
Termlist readvars;
|
||||
|
||||
claimvars = termlistAddVariables (NULL, msg);
|
||||
readvars = compute_read_variables (thisRole);
|
||||
while (claimvars != NULL)
|
||||
{
|
||||
if (!inTermlist (readvars, claimvars->term))
|
||||
{
|
||||
/* this claimvar does not occur in the reads? */
|
||||
/* then we should ignore it later */
|
||||
cl->alwaystrue = true;
|
||||
cl->warnings = true;
|
||||
}
|
||||
claimvars = claimvars->next;
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
if (claim == CLAIM_Nisynch)
|
||||
@ -1423,9 +1476,10 @@ compute_prec_sets (const System sys)
|
||||
if (cl->prec == NULL)
|
||||
{
|
||||
globalError++;
|
||||
eprintf ("Warning: claim with empty prec() set at r:%i, ev:%i\n",
|
||||
eprintf ("warning: claim with empty prec() set at r:%i, ev:%i\n",
|
||||
r1, ev1);
|
||||
globalError--;
|
||||
cl->warnings = true;
|
||||
}
|
||||
else
|
||||
{
|
||||
@ -1467,6 +1521,74 @@ compute_prec_sets (const System sys)
|
||||
|
||||
}
|
||||
|
||||
//! Check unused variables
|
||||
void
|
||||
checkRoleVariables (const System sys, const Protocol p, const Role r)
|
||||
{
|
||||
Termlist vars;
|
||||
Termlist declared;
|
||||
|
||||
int process_event (Roledef rd)
|
||||
{
|
||||
if (rd->type == READ)
|
||||
{
|
||||
vars = termlistAddVariables (vars, rd->from);
|
||||
vars = termlistAddVariables (vars, rd->to);
|
||||
vars = termlistAddVariables (vars, rd->message);
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
||||
/* Gather all variables occurring in the reads */
|
||||
vars = NULL;
|
||||
roledef_iterate_events (r->roledef, process_event);
|
||||
|
||||
/* Now, all variables for this role should be in the reads */
|
||||
declared = r->declaredvars;
|
||||
while (declared != NULL)
|
||||
{
|
||||
if (!inTermlist (vars, declared->term))
|
||||
{
|
||||
// Warning
|
||||
globalError++;
|
||||
eprintf ("warning: variable ");
|
||||
termPrint (declared->term);
|
||||
eprintf (" was declared in role ");
|
||||
termPrint (p->nameterm);
|
||||
eprintf (",");
|
||||
termPrint (r->nameterm);
|
||||
eprintf (" but never used in a read event.\n");
|
||||
globalError--;
|
||||
}
|
||||
declared = declared->next;
|
||||
}
|
||||
|
||||
termlistDelete (vars);
|
||||
}
|
||||
|
||||
//! Check unused variables
|
||||
/**
|
||||
* This is checked per role
|
||||
*/
|
||||
void
|
||||
checkUnusedVariables (const System sys)
|
||||
{
|
||||
Protocol p;
|
||||
|
||||
p = sys->protocols;
|
||||
while (p != NULL)
|
||||
{
|
||||
Role r;
|
||||
r = p->roles;
|
||||
while (r != NULL)
|
||||
{
|
||||
checkRoleVariables (sys, p, r);
|
||||
r = r->next;
|
||||
}
|
||||
p = p->next;
|
||||
}
|
||||
}
|
||||
|
||||
//! Preprocess after system compilation
|
||||
void
|
||||
preprocess (const System sys)
|
||||
@ -1480,4 +1602,8 @@ preprocess (const System sys)
|
||||
* compute preceding label sets
|
||||
*/
|
||||
compute_prec_sets (sys);
|
||||
/*
|
||||
* check for ununsed variables
|
||||
*/
|
||||
checkUnusedVariables (sys);
|
||||
}
|
||||
|
@ -441,6 +441,12 @@ timersPrint (const System sys)
|
||||
}
|
||||
}
|
||||
|
||||
/* any warnings */
|
||||
if (cl_scan->warnings)
|
||||
{
|
||||
eprintf ("\t(read the warnings for more information)");
|
||||
}
|
||||
|
||||
/* proceed to next claim */
|
||||
eprintf ("\n");
|
||||
}
|
||||
|
@ -240,6 +240,7 @@ roleCreate (Term name)
|
||||
r->roledef = NULL;
|
||||
r->locals = NULL;
|
||||
r->variables = NULL;
|
||||
r->declaredvars = NULL;
|
||||
r->initiator = 1; //! Will be determined later, if a read is the first action (in compiler.c)
|
||||
r->next = NULL;
|
||||
return r;
|
||||
|
@ -35,6 +35,10 @@ struct claimlist
|
||||
int complete;
|
||||
//! If we ran into the time bound (incomplete, and bad for results)
|
||||
int timebound;
|
||||
//! Some claims are always true (shown by the initial scan)
|
||||
int alwaystrue;
|
||||
//! Warnings should tell you more
|
||||
int warnings;
|
||||
|
||||
int r; //!< role number for mapping
|
||||
int ev; //!< event index in role
|
||||
@ -120,6 +124,8 @@ struct role
|
||||
Termlist locals;
|
||||
//! Local variables for this role.
|
||||
Termlist variables;
|
||||
//! Declared variables for this role
|
||||
Termlist declaredvars;
|
||||
//! Flag for initiator roles
|
||||
int initiator;
|
||||
//! Pointer to next role definition.
|
||||
|
Loading…
Reference in New Issue
Block a user