- More logic.
This commit is contained in:
parent
b74567b2e0
commit
f30207b059
117
src/arachne.c
117
src/arachne.c
@ -6,9 +6,21 @@
|
|||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#include "term.h"
|
||||||
|
#include "role.h"
|
||||||
#include "system.h"
|
#include "system.h"
|
||||||
#include "arachne.h"
|
#include "arachne.h"
|
||||||
|
|
||||||
|
Term INTRUDER_ROLE;
|
||||||
|
|
||||||
|
struct goalstruct
|
||||||
|
{
|
||||||
|
int run;
|
||||||
|
int index;
|
||||||
|
};
|
||||||
|
|
||||||
|
typedef struct goalstruct Goal;
|
||||||
|
|
||||||
//! Init Arachne engine
|
//! Init Arachne engine
|
||||||
void
|
void
|
||||||
arachneInit (const System sys)
|
arachneInit (const System sys)
|
||||||
@ -26,6 +38,87 @@ arachneDone (const System sys)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//------------------------------------------------------------------------
|
||||||
|
// Detail
|
||||||
|
//------------------------------------------------------------------------
|
||||||
|
|
||||||
|
/*
|
||||||
|
* runs[rid].step is now the number of 'valid' events within the run, but we
|
||||||
|
* call it 'length' here.
|
||||||
|
*/
|
||||||
|
#define INVALID -1
|
||||||
|
#define isGoal(rd) (rd->type == READ)
|
||||||
|
#define isBound(rd) (rd->bind_run != INVALID)
|
||||||
|
#define length step
|
||||||
|
|
||||||
|
//------------------------------------------------------------------------
|
||||||
|
// Sub
|
||||||
|
//------------------------------------------------------------------------
|
||||||
|
|
||||||
|
//------------------------------------------------------------------------
|
||||||
|
// Larger logical componentents
|
||||||
|
//------------------------------------------------------------------------
|
||||||
|
|
||||||
|
//! Goal selection
|
||||||
|
/**
|
||||||
|
* Should be ordered to prefer most constrained; for now, it is simply the first one encountered.
|
||||||
|
*/
|
||||||
|
Goal
|
||||||
|
select_goal (const System sys)
|
||||||
|
{
|
||||||
|
Goal goal;
|
||||||
|
int run;
|
||||||
|
|
||||||
|
goal.run = INVALID;
|
||||||
|
for (run = 0; run < sys->maxruns; run++)
|
||||||
|
{
|
||||||
|
Roledef rd;
|
||||||
|
int index;
|
||||||
|
|
||||||
|
index = 0;
|
||||||
|
rd = runPointerGet (sys, run);
|
||||||
|
while (rd != NULL && index < sys->runs[run].length)
|
||||||
|
{
|
||||||
|
if (isGoal (rd) && !isBound (rd))
|
||||||
|
{
|
||||||
|
// Return this goal
|
||||||
|
goal.run = run;
|
||||||
|
goal.index = index;
|
||||||
|
return goal;
|
||||||
|
}
|
||||||
|
index++;
|
||||||
|
rd = rd->next;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return goal;
|
||||||
|
}
|
||||||
|
|
||||||
|
//! Bind a regular goal
|
||||||
|
int
|
||||||
|
bind_goal_regular (const System sys, const Goal goal)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
//! Bind an intruder goal
|
||||||
|
int
|
||||||
|
bind_goal_intruder (const System sys, const Goal goal)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
//! Bind a goal in all possible ways
|
||||||
|
int
|
||||||
|
bind_goal (const System sys, const Goal goal)
|
||||||
|
{
|
||||||
|
if (isTermEqual (sys->runs[goal.run].protocol->nameterm, INTRUDER_ROLE))
|
||||||
|
{
|
||||||
|
return bind_goal_intruder (sys, goal);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return bind_goal_regular (sys, goal);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
//! Prune determination
|
//! Prune determination
|
||||||
/**
|
/**
|
||||||
*@returns true iff this state is invalid for some reason
|
*@returns true iff this state is invalid for some reason
|
||||||
@ -36,10 +129,16 @@ prune (const System sys)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//------------------------------------------------------------------------
|
||||||
|
// Main logic core
|
||||||
|
//------------------------------------------------------------------------
|
||||||
|
|
||||||
//! Main recursive procedure for Arachne
|
//! Main recursive procedure for Arachne
|
||||||
int
|
int
|
||||||
iterate (const System sys)
|
iterate (const System sys)
|
||||||
{
|
{
|
||||||
|
Goal goal;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Possibly prune this state
|
* Possibly prune this state
|
||||||
*/
|
*/
|
||||||
@ -49,9 +148,23 @@ iterate (const System sys)
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* If not pruned, check whether its a final state (i.e. all goals bound)
|
* If not pruned, check whether its a final state (i.e. all goals bound)
|
||||||
* - Yes: check whether property holds
|
|
||||||
* - No: iterate further
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
goal = select_goal (sys);
|
||||||
|
if (goal.run == INVALID)
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
* all goals bound, check for property
|
||||||
|
*/
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
* bind this goal in all possible ways and iterate
|
||||||
|
*/
|
||||||
|
return bind_goal (sys, goal);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//! Main code for Arachne
|
//! Main code for Arachne
|
||||||
|
Loading…
Reference in New Issue
Block a user