- Huge documentation effort.

This commit is contained in:
ccremers 2004-05-15 12:33:01 +00:00
parent 89e83b1661
commit e26d97bf2b
9 changed files with 394 additions and 194 deletions

4
README
View File

@ -31,3 +31,7 @@ If you want LaTeX output we need
- The MSC macro package msc.sty - The MSC macro package msc.sty
- preamble.tex and postamble.tex - preamble.tex and postamble.tex
For the documentation generation, optionally with graphs.
- Doxygen: http://www.doxygen.org/
- Dot: http://www.research.att.com/sw/tools/graphviz/

View File

@ -997,7 +997,7 @@ HIDE_UNDOC_RELATIONS = YES
# toolkit from AT&T and Lucent Bell Labs. The other options in this section # toolkit from AT&T and Lucent Bell Labs. The other options in this section
# have no effect if this option is set to NO (the default) # have no effect if this option is set to NO (the default)
HAVE_DOT = NO HAVE_DOT = YES
# If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen # If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen
# will generate a graph for each documented class showing the direct and # will generate a graph for each documented class showing the direct and

View File

@ -4,18 +4,31 @@
#include "terms.h" #include "terms.h"
#include "termlists.h" #include "termlists.h"
//! Knowledge structure.
/**
* Contains a miminal representation of a knowledge set.
*/
struct knowledge struct knowledge
{ {
//! A list of non-encrypted terms.
Termlist basic; Termlist basic;
//! A list of terms encrypted, such that the inverse is not in the knowledge set.
Termlist encrypt; Termlist encrypt;
Termlist inverses; Termlist inverses;
union union
{ {
//! List of open variables in the knowledge set.
/**
* This list is used to determine whether the knowledge needs to be rewritten.
* If a new substitution is done, one of the elements of this list will become closed,
* and we need to reconstruct the knowledge set.
*/
Termlist vars; // special: denotes unsubstituted variables Termlist vars; // special: denotes unsubstituted variables
struct knowledge *next; // use for alternative memory management. struct knowledge *next; // use for alternative memory management.
}; };
}; };
//! Shorthand for knowledge pointer.
typedef struct knowledge *Knowledge; typedef struct knowledge *Knowledge;
void knowledgeInit (void); void knowledgeInit (void);
@ -41,6 +54,7 @@ Knowledge knowledgeSubstDo (const Knowledge know);
void knowledgeSubstUndo (const Knowledge know); void knowledgeSubstUndo (const Knowledge know);
Termlist knowledgeNew (const Knowledge oldk, const Knowledge newk); Termlist knowledgeNew (const Knowledge oldk, const Knowledge newk);
//! Harnass macro for recursive procedures.
#define mindwipe(k,recurse) \ #define mindwipe(k,recurse) \
if (k != NULL && k->vars != NULL) { \ if (k != NULL && k->vars != NULL) { \
Termlist tl = k->vars; \ Termlist tl = k->vars; \

View File

@ -1,3 +1,7 @@
/**
* @file runs.c Originally contained only procedures related to runs, but has grown
* somewhat over time.
*/
#include <stdlib.h> #include <stdlib.h>
#include <stdio.h> #include <stdio.h>
#include <limits.h> #include <limits.h>
@ -14,7 +18,10 @@
/* from compiler.o */ /* from compiler.o */
extern Term TERM_Type; extern Term TERM_Type;
/* for e.g. termprinting */ //! Global flag that signals LaTeX output.
/**
* True iff LaTeX output is desired.
*/
int globalLatex; int globalLatex;
static int indentState = 0; static int indentState = 0;

View File

@ -13,125 +13,192 @@
#define runPointerGet(sys,run) sys->runs[run].index #define runPointerGet(sys,run) sys->runs[run].index
#define runPointerSet(sys,run,newp) sys->runs[run].index = newp #define runPointerSet(sys,run,newp) sys->runs[run].index = newp
//! Structure for a role event node or list.
/**
*\sa role
*/
struct roledef struct roledef
{ {
/* flag for internal actions (overriding normal type) */ //! flag for internal actions.
/**
* Typically, this is true to signify internal reads (e.g. variable choices)
* as opposed to a normal read.
*/
int internal; int internal;
//! Type of event.
/**
*\sa READ, SEND, CLAIM
*/
int type; int type;
//! Event label.
Term label; Term label;
//! Event sender.
Term from; Term from;
//! Event target.
Term to; Term to;
//! Event message.
Term message; Term message;
//! Pointer to next roledef node.
struct roledef *next; struct roledef *next;
/* illegal injections */ //! Illegal injections for this event.
Knowledge forbidden; Knowledge forbidden;
/* knowledge transitions counter */ //! knowledge transitions counter.
int knowPhase; int knowPhase;
/* evt runid for synchronisation, but that is implied in the /* evt runid for synchronisation, but that is implied in the
base array */ base array */
}; };
//! Shorthand for roledef pointer.
typedef struct roledef *Roledef; typedef struct roledef *Roledef;
//! Role definition.
/**
*\sa roledef
*/
struct role struct role
{ {
//! Name of the role encoded in a term.
Term nameterm; Term nameterm;
//! List of role events.
Roledef roledef; Roledef roledef;
//! Local constants for this role.
Termlist locals; Termlist locals;
//! Pointer to next role definition.
struct role *next; struct role *next;
}; };
//! Shorthand for role pointer.
typedef struct role *Role; typedef struct role *Role;
//! Protocol definition.
struct protocol struct protocol
{ {
//! Name of the protocol encoded in a term.
Term nameterm; Term nameterm;
//! List of role definitions.
Role roles; Role roles;
//! List of role names.
Termlist rolenames; Termlist rolenames;
//! List of local terms for this protocol.
Termlist locals; Termlist locals;
//! Pointer to next protocol.
struct protocol *next; struct protocol *next;
}; };
//! Shorthand for protocol pointer.
typedef struct protocol *Protocol; typedef struct protocol *Protocol;
//! Run container.
struct run struct run
{ {
//! Protocol of this run.
Protocol protocol; Protocol protocol;
//! Role of this run.
Role role; Role role;
//! Agents involved in this run.
Termlist agents; Termlist agents;
//! Current execution point in the run.
Roledef index; Roledef index;
//! Head of the run definition.
Roledef start; Roledef start;
//! Current knowledge of the run.
Knowledge know; Knowledge know;
//! Locals of the run.
Termlist locals; Termlist locals;
}; };
//! Shorthand for run pointer.
typedef struct run *Run; typedef struct run *Run;
//! Buffer for variables substitution state.
struct varbuf struct varbuf
{ {
//! List of closed variables.
Termlist from; Termlist from;
//! List of terms to which the closed variables are bound.
Termlist to; Termlist to;
//! List of open variables.
Termlist empty; Termlist empty;
}; };
//! Shorthand for varbuf pointer.
typedef struct varbuf *Varbuf; typedef struct varbuf *Varbuf;
//! Trace buffer.
struct tracebuf struct tracebuf
{ {
//! Length of trace.
int length; int length;
//! Length of trace minus the redundant events.
int reallength; int reallength;
//! Array of events.
Roledef *event; Roledef *event;
//! Array of run identifiers for each event.
int *run; int *run;
//! Array of status flags for each event.
/**
*\sa S_OKE, S_RED, S_TOD, S_UNK
*/
int *status; int *status;
//! Array for matching sends to reads.
int *link; int *link;
int violatedclaim; // index of violated claim in trace //! Index of violated claim in trace.
int violatedclaim;
//! Array of knowledge sets for each event.
Knowledge *know; Knowledge *know;
//! List of terms required to be in the final knowledge.
Termlist requiredterms; Termlist requiredterms;
//! List of variables in the system.
Varbuf variables; Varbuf variables;
}; };
//! The main state structure.
struct system struct system
{ {
int step; // can be managed globally int step; //!< Step in trace during exploration. Can be managed globally
Knowledge know; Knowledge know; //!< Knowledge in currect step of system.
struct parameters *parameters; // misc struct parameters *parameters; // misc
/* static run info, maxruns */ /* static run info, maxruns */
Run runs; Run runs;
/* global */ /* global */
int maxruns; int maxruns; //!< Number of runs in the system.
/* properties */ /* properties */
Termlist secrets; // integrate secrets list into system Termlist secrets; //!< Integrate secrets list into system.
int shortestattack; // length of shortest attack trace int shortestattack; //!< Length of shortest attack trace.
/* switches */ /* switches */
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_maxtracelength; //!< Helps to remember the length of the last trace.
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 int switchM; //!< Memory display switch.
int switchT; // time int switchT; //!< Time display switch.
int switchS; // progress (traversed states) int switchS; //!< Progress display switch. (traversed states)
int porparam; // a multi-purpose integer parameter, passed to the partial order reduction method selected int porparam; //!< A multi-purpose integer parameter, passed to the partial order reduction method selected.
int latex; // latex output switch //! Latex output switch.
/**
* Obsolete. Use globalLatex instead.
*\sa globalLatex
*/
int latex;
/* traversal */ /* traversal */
int traverse; // traversal method int traverse; //!< Traversal method.
int explore; // boolean: explore states after actions or not int explore; //!< Boolean: explore states after actions or not.
/* counters */ /* counters */
unsigned long int statesLow; unsigned long int statesLow;
unsigned long int statesHigh; unsigned long int statesHigh;
unsigned long int claims; // number of claims encountered unsigned long int claims; //!< Number of claims encountered.
unsigned long int failed; // number of claims failed unsigned long int failed; //!< Number of claims failed.
/* matching */ /* matching */
int match; // matching type int match; //!< Matching type.
int clp; // do we use clp? int clp; //!< Do we use clp?
/* protocol definition */ /* protocol definition */
Protocol protocols; Protocol protocols;
@ -150,7 +217,7 @@ struct system
int knowPhase; // which knowPhase have we already explored? int knowPhase; // which knowPhase have we already explored?
Constraintlist constraints; // only needed for CLP match Constraintlist constraints; // only needed for CLP match
/* relevant: storage of shortest attack */ //! Shortest attack storage.
struct tracebuf* attack; struct tracebuf* attack;
}; };

View File

@ -11,34 +11,36 @@
extern Term TERM_Function; extern Term TERM_Function;
extern Term TERM_Hidden; extern Term TERM_Hidden;
//! Open termlists code.
void void
termlistsInit (void) termlistsInit (void)
{ {
return; return;
} }
//! Close termlists code.
void void
termlistsDone (void) termlistsDone (void)
{ {
return; return;
} }
/* inline candidate */ //! Allocate memory for a termlist node.
/**
*@return A pointer to uninitialised memory of the size of a termlist node.
*/
Termlist Termlist
makeTermlist () makeTermlist ()
{ {
/* inline candidate */
return (Termlist) memAlloc (sizeof (struct termlist)); return (Termlist) memAlloc (sizeof (struct termlist));
} }
/* //! Duplicate a termlist.
/**
termlistDuplicate * Uses termDuplicate to copy the elements, and allocated new memory for the list nodes.
*\sa termDuplicate(), termlistShallow()
A deep copy. */
*/
Termlist Termlist
termlistDuplicate (Termlist tl) termlistDuplicate (Termlist tl)
{ {
@ -55,15 +57,12 @@ termlistDuplicate (Termlist tl)
return newtl; return newtl;
} }
/* //! Shallow reverse copy of a termlist.
/**
termlistShallow * Just copies the element pointers. Allocates new memory for the list nodes.
* Note that it reverses the order of the list.
A shallow copy, because I gather we won't be modifying any terms, only *\sa termlistDuplicate()
termlists. Oh, and it reverses the order :) Don't forget! */
*/
Termlist Termlist
termlistShallow (Termlist tl) termlistShallow (Termlist tl)
{ {
@ -78,14 +77,11 @@ termlistShallow (Termlist tl)
return newtl; return newtl;
} }
/* //! Shallow deletion of a termlist.
/**
termlistDelete * Deletes the termlist nodes only. Elements are intact after exit.
*\sa termlistShallow()
(shallow) */
*/
void void
termlistDelete (Termlist tl) termlistDelete (Termlist tl)
{ {
@ -96,14 +92,11 @@ termlistDelete (Termlist tl)
} }
/* //! Deep deletion of a termlist.
/**
termlistDestroy * Deletes the termlist nodes as well as the elements.
*\sa termlistDuplicate(), termDuplicate(), termDelete()
(deep) */
*/
void void
termlistDestroy (Termlist tl) termlistDestroy (Termlist tl)
{ {
@ -114,14 +107,10 @@ termlistDestroy (Termlist tl)
memFree (tl, sizeof (struct termlist)); memFree (tl, sizeof (struct termlist));
} }
/* //! Determine whether a term is an element of a termlist.
/**
inTermlist *@return True iff the term is an element of the termlist.
*/
check whether a term occurs in a termlist
*/
int int
inTermlist (Termlist tl, Term term) inTermlist (Termlist tl, Term term)
{ {
@ -141,8 +130,11 @@ inTermlist (Termlist tl, Term term)
} }
} }
/* are all elements of list 1 in list 2, and vice versa? //! Equality of two term lists.
Note that we assume unique elements ! /**
* Are all elements of list 1 in list 2, and vice versa?
* Note that we assume unique elements!
*@param True iff every element of the list is in the other list.
*/ */
int int
@ -159,15 +151,12 @@ isTermlistEqual (Termlist tl1, Termlist tl2)
return 1; return 1;
} }
/* //! Adds a term to the front of a termlist.
/**
termlistAdd * Duplicates are allowed.
*@return A new list pointer.
Adds a term. Duplicates are allowed. *\sa termlistAppend()
A new list pointer is returned. */
*/
Termlist Termlist
termlistAdd (Termlist tl, Term term) termlistAdd (Termlist tl, Term term)
{ {
@ -191,15 +180,12 @@ termlistAdd (Termlist tl, Term term)
return newtl; return newtl;
} }
/* //! Adds a term to the end of a termlist.
/**
termlistAppend * Duplicates are allowed.
*@return A new list pointer if the termlist was NULL.
Appends a term to the end of the list. Duplicates are allowed. *\sa termlistAdd()
A new list pointer is returned. */
*/
Termlist Termlist
termlistAppend (const Termlist tl, const Term term) termlistAppend (const Termlist tl, const Term term)
{ {
@ -226,6 +212,11 @@ termlistAppend (const Termlist tl, const Term term)
return tl; return tl;
} }
//! Concatenates two termlists.
/**
* The last pointer of the first list is made to point to the second list.
*@return The pointer to the concatenated list.
*/
Termlist Termlist
termlistConcat (Termlist tl1, Termlist tl2) termlistConcat (Termlist tl1, Termlist tl2)
{ {
@ -241,14 +232,12 @@ termlistConcat (Termlist tl1, Termlist tl2)
return tl1; return tl1;
} }
/* //! Remove the pointed at element from the termlist.
/**
termlistDelTerm * Easier because of the double linked list.
*@param tl The pointer to the termlist node to be deleted from the list.
remove the current element from the termlist. Easier because of the *@return The possibly new head pointer to the termlist.
double linked list. */
*/
Termlist Termlist
termlistDelTerm (Termlist tl) termlistDelTerm (Termlist tl)
{ {
@ -273,6 +262,10 @@ termlistDelTerm (Termlist tl)
return newhead; return newhead;
} }
//! Construct the conjunction of two termlists.
/**
*@return A new termlist containing the elements in both lists.
*/
Termlist Termlist
termlistConjunct (Termlist tl1, Termlist tl2) termlistConjunct (Termlist tl1, Termlist tl2)
{ {
@ -290,6 +283,10 @@ termlistConjunct (Termlist tl1, Termlist tl2)
return newtl; return newtl;
} }
//! Construct the conjunction of two termlists, and a certain type.
/**
*@return A new termlist containing the elements in both lists, that are also of the desired type.
*/
Termlist Termlist
termlistConjunctType (Termlist tl1, Termlist tl2, int termtype) termlistConjunctType (Termlist tl1, Termlist tl2, int termtype)
{ {
@ -307,6 +304,10 @@ termlistConjunctType (Termlist tl1, Termlist tl2, int termtype)
return newtl; return newtl;
} }
//! Construct the conjunction of a termlist and a certain type.
/**
*@return A new termlist containing the elements in the list that are of the desired type.
*/
Termlist Termlist
termlistType (Termlist tl, int termtype) termlistType (Termlist tl, int termtype)
{ {
@ -324,6 +325,10 @@ termlistType (Termlist tl, int termtype)
return newtl; return newtl;
} }
//! Display a termlist.
/**
* Lists of terms are displayed between square brackets, and seperated by commas.
*/
void void
termlistPrint (Termlist tl) termlistPrint (Termlist tl)
{ {
@ -343,6 +348,13 @@ termlistPrint (Termlist tl)
printf ("]"); printf ("]");
} }
//! Append all open variables in a term to a list.
/**
*@param tl The list to which to append to.
*@param t The term possibly containing open variables.
*@return The pointer to the extended list.
*\sa termlistAddRealVariables()
*/
Termlist Termlist
termlistAddVariables (Termlist tl, Term t) termlistAddVariables (Termlist tl, Term t)
{ {
@ -368,6 +380,13 @@ termlistAddVariables (Termlist tl, Term t)
} }
} }
//! Append all variables in a term to a list.
/**
*@param tl The list to which to append to.
*@param t The term possibly containing open and closed variables.
*@return The pointer to the extended list.
*\sa termlistAddVariables()
*/
Termlist Termlist
termlistAddRealVariables (Termlist tl, Term t) termlistAddRealVariables (Termlist tl, Term t)
{ {
@ -403,6 +422,13 @@ termlistAddRealVariables (Termlist tl, Term t)
} }
} }
//! Append all basic terms in a term to a list.
/**
*@param tl The list to which to append to.
*@param t The term containing basic terms.
*@return The pointer to the extended list.
*\sa termlistAddBasics()
*/
Termlist Termlist
termlistAddBasic (Termlist tl, Term t) termlistAddBasic (Termlist tl, Term t)
{ {
@ -426,6 +452,13 @@ termlistAddBasic (Termlist tl, Term t)
return tl; return tl;
} }
//! Append all basic terms in a termlist to another list.
/**
*@param tl The list to which to append to.
*@param scan The termlist with terms containing basic terms.
*@return The pointer to the extended list.
*\sa termlistAddBasic()
*/
Termlist Termlist
termlistAddBasics (Termlist tl, Termlist scan) termlistAddBasics (Termlist tl, Termlist scan)
{ {
@ -437,13 +470,11 @@ termlistAddBasics (Termlist tl, Termlist scan)
return tl; return tl;
} }
/* //! Remove a term from a termlist.
* termlistMinusTerm /**
* * Removes the first occurrence of the term.
* Remove a term from a termlist, and yield a new termlist pointer. *@return A new termlist pointer.
* Semantics: remove the first occurrence of the term.
*/ */
Termlist Termlist
termlistMinusTerm (Termlist tl, Term t) termlistMinusTerm (Termlist tl, Term t)
{ {
@ -460,6 +491,7 @@ termlistMinusTerm (Termlist tl, Term t)
return tl; return tl;
} }
//! Determine the length of a termlist.
int int
termlistLength (Termlist tl) termlistLength (Termlist tl)
{ {
@ -473,14 +505,15 @@ termlistLength (Termlist tl)
return i; return i;
} }
/* //! Give the inverse key term of a term.
/**
inverseKey * Gives a duplicate of the inverse Key of some term (which is used to encrypt something), as is defined
* by the termlist, which is a list of key1,key1inv, key2, key2inv, etc...
Gives the inverse Key of some term (which is used to encrypt something), as is defined *@param inverses The list of inverses, typically from the knowledge.
by the termlist, which is a list of key1,key1inv, key2, key2inv, etc... *@param key Any term of which the inverse will be determined.
*@return A pointer to a duplicate of the inverse key term.
*/ *\sa termDuplicate(), knowledge::inverses
*/
Term Term
@ -535,14 +568,12 @@ inverseKey (Termlist inverses, Term key)
return termDuplicate (key); /* defaults to symmetrical */ return termDuplicate (key); /* defaults to symmetrical */
} }
//! Create a term local to a run.
/* /*
* localTerm
*
* Creates a term local to a run.
* We assume that at this point, no variables have been instantiated yet that occur in this term. * We assume that at this point, no variables have been instantiated yet that occur in this term.
* We also assume that fromlist, tolist and locals only hold real leaves. * We also assume that fromlist, tolist and locals only hold real leaves.
*\sa termlistLocal()
*/ */
Term Term
termLocal (const Term t, Termlist fromlist, Termlist tolist, termLocal (const Term t, Termlist fromlist, Termlist tolist,
const Termlist locals, const int runid) const Termlist locals, const int runid)
@ -585,12 +616,11 @@ termLocal (const Term t, Termlist fromlist, Termlist tolist,
} }
} }
/* //! Create a list of instance terms.
* termlistLocal /**
* * We expand the termlocal concept to termlists.
* We expand the previous concept to termlists. *\sa termLocal()
*/ */
Termlist Termlist
termlistLocal (Termlist tl, const Termlist fromlist, const Termlist tolist, termlistLocal (Termlist tl, const Termlist fromlist, const Termlist tolist,
const Termlist locals, int runid) const Termlist locals, int runid)
@ -607,10 +637,12 @@ termlistLocal (Termlist tl, const Termlist fromlist, const Termlist tolist,
return newtl; return newtl;
} }
/* //! Check whether a termlist is contained in another.
* Check whether tl2 is contained in tl1. /**
*@param tlbig The big list.
*@param tlsmall The list that is possibly contained in the big one.
*@return True iff tlsmall is contained in tlbig.
*/ */
int int
termlistContained (const Termlist tlbig, Termlist tlsmall) termlistContained (const Termlist tlbig, Termlist tlsmall)
{ {
@ -623,9 +655,14 @@ termlistContained (const Termlist tlbig, Termlist tlsmall)
return 1; return 1;
} }
/* //! Check substitution validity
/**
* Determine whether a variable has been substituted with something with * Determine whether a variable has been substituted with something with
* the right type. * the right type.
*@param matchmode The system matching mode, typically system::match
*@param term The closed variable term.
*@return True iff the substitution is valid in the current mode.
*\sa system::match
*/ */
int int
@ -653,15 +690,15 @@ validSubst (const int matchmode, const Term term)
} }
} }
/* //! Yield the result of f(x)
* termFunction /**
* * This function interpretes two termlists as the domain and range of a function,
* An assist function that helps to simulate Term->Term functions, using * and if the term occurs in the domain, returns the matching value from the range.
* termlists. One termlist functions as the domain, and the other as the * Note that these functions cannot have NULL in the domain or the range.
* range. *@param fromlist The domain list.
* *@param tolist The range list, in a one-to-one correspondence with the fromlist.
* Extending a function with a value y = f(x) amounts to extending the *@param tx The point on which the function is to be evaluated.
* domain with x, and the range with y. *@return The result of the function application or NULL if the point is not within the domain.
*/ */
Term Term
@ -679,10 +716,7 @@ termFunction (Termlist fromlist, Termlist tolist, Term tx)
return NULL; return NULL;
} }
/* //! Yield the last node of a termlist.
* Forward the termlist pointer to the last item
*/
Termlist Termlist
termlistForward (Termlist tl) termlistForward (Termlist tl)
{ {

View File

@ -3,13 +3,22 @@
#include "terms.h" #include "terms.h"
//! The list container for the term type.
/**
* Implemented as a double linked list to allow for element deletion.
*\sa term
*/
struct termlist struct termlist
{ {
//! The term element for this node.
Term term; Term term;
//! Next node pointer or NULL for the tail of the list.
struct termlist *next; struct termlist *next;
//! Previous node pointer or NULL for the head of the list.
struct termlist *prev; struct termlist *prev;
}; };
//! Shorthand for termlist pointers.
typedef struct termlist *Termlist; typedef struct termlist *Termlist;
void termlistsInit (void); void termlistsInit (void);

View File

@ -25,24 +25,34 @@ void indent (void);
/* Two types of terms: general, and normalized. Normalized rewrites all /* Two types of terms: general, and normalized. Normalized rewrites all
tuples to (x,(y,z))..NULL form, making list traversal easy. */ tuples to (x,(y,z))..NULL form, making list traversal easy. */
//! Initialization of terms code.
void void
termsInit (void) termsInit (void)
{ {
return; return;
} }
//! Cleanup of terms code.
void void
termsDone (void) termsDone (void)
{ {
return; return;
} }
//! Allocate memory for a term.
/**
*@return A pointer to the new term memory, which is not yet initialised.
*/
Term Term
makeTerm () makeTerm ()
{ {
return (Term) memAlloc (sizeof (struct term)); return (Term) memAlloc (sizeof (struct term));
} }
//! Create a fresh encrypted term from two existing terms.
/**
*@return A pointer to the new term.
*/
Term Term
makeTermEncrypt (Term t1, Term t2) makeTermEncrypt (Term t1, Term t2)
{ {
@ -54,6 +64,10 @@ makeTermEncrypt (Term t1, Term t2)
return term; return term;
} }
//! Create a fresh term tuple from two existing terms.
/**
*@return A pointer to the new term.
*/
Term Term
makeTermTuple (Term t1, Term t2) makeTermTuple (Term t1, Term t2)
{ {
@ -82,6 +96,11 @@ makeTermTuple (Term t1, Term t2)
return tt; return tt;
} }
//! Make a term of the given type with run identifier and symbol.
/**
*@return A pointer to the new term.
*\sa GLOBAL, VARIABLE, LEAF, ENCRYPT, TUPLE
*/
Term Term
makeTermType (const int type, const Symbol symb, const int runid) makeTermType (const int type, const Symbol symb, const int runid)
{ {
@ -94,12 +113,13 @@ makeTermType (const int type, const Symbol symb, const int runid)
return term; return term;
} }
/* deVar unwraps any substitutions. //! Unwrap any substitutions.
* /**
* For speed, it is a macro. Sometimes it will call * For speed, it is also a macro. Sometimes it will call
* deVarScan to do the actual unwinding. * deVarScan to do the actual unwinding.
*@return A term that is either not a variable, or has a NULL substitution.
*\sa deVar()
*/ */
Term Term
deVarScan (Term t) deVarScan (Term t)
{ {
@ -108,6 +128,10 @@ deVarScan (Term t)
return t; return t;
} }
//! Determine whether a term contains an unsubstituted variable as subterm.
/**
*@return True iff there is an open variable as subterm.
*/
int int
hasTermVariable (Term term) hasTermVariable (Term term)
{ {
@ -125,18 +149,16 @@ hasTermVariable (Term term)
} }
} }
/*
isTermEqualFn(term,term) //!Tests whether two terms are completely identical.
/**
Tests whether two terms are completely identical. This also includes * This also includes
variables. This is the recursive function. * variables. This is the recursive function.
* We assume the term is normalized, e.g. no tupling has direct
We assume the term is normalized, e.g. no tupling has direct * subtupling.
subtupling. *@return True iff the terms are equal.
*\sa isTermEqual()
Out: 0 unequal, 1 equal */
*/
int int
isTermEqualFn (Term term1, Term term2) isTermEqualFn (Term term1, Term term2)
@ -179,6 +201,12 @@ isTermEqualFn (Term term1, Term term2)
} }
} }
//! See if a term is a subterm of another.
/**
*@param t Term to be checked for a subterm.
*@param tsub Subterm.
*@return True iff tsub is a subterm of t.
*/
int int
termOccurs (Term t, Term tsub) termOccurs (Term t, Term tsub)
{ {
@ -195,7 +223,7 @@ termOccurs (Term t, Term tsub)
return (termOccurs (t->op, tsub) || termOccurs (t->key, tsub)); return (termOccurs (t->op, tsub) || termOccurs (t->key, tsub));
} }
//! Print a term to stdout.
void void
termPrint (Term term) termPrint (Term term)
{ {
@ -282,13 +310,12 @@ termPrint (Term term)
} }
/* //! Make a deep copy of a term.
/**
Duplicate * Leaves are not copied.
*@return If the original was a leaf, then the pointer is simply returned. Otherwise, new memory is allocated and the node is copied recursively.
make a deep copy of a term, but not of leaves. *\sa termDuplicateDeep()
*/
*/
Term Term
termDuplicate (const Term term) termDuplicate (const Term term)
@ -315,13 +342,13 @@ termDuplicate (const Term term)
return newterm; return newterm;
} }
/* //! Make a true deep copy of a term.
/**
* Currently, it this function is not to be used, so we can be sure leaf nodes occur only once in the system.
*@return New memory is allocated and the node is copied recursively.
*\sa termDuplicate()
*/
DuplicateDeep
make a deep copy of a term, and also of leaves.
*/
Term Term
termDuplicateDeep (const Term term) termDuplicateDeep (const Term term)
@ -353,10 +380,10 @@ termDuplicateDeep (const Term term)
return newterm; return newterm;
} }
/* //! Make a copy of a term, but remove substituted variable nodes.
* DuplicateUV /**
*
* Remove all instantiated variables on the way down. * Remove all instantiated variables on the way down.
*\sa termDuplicate()
*/ */
Term Term
@ -423,13 +450,12 @@ realTermDuplicate (const Term term)
return newterm; return newterm;
} }
/* //!Removes a term and deallocates memory.
/**
termDelete * Is meant to remove terms make with termDuplicate. Only deallocates memory
* of nodes, not of leaves.
Removes a term and deallocates memory *\sa termDuplicate(), termDuplicateUV()
*/
*/
void void
termDelete (const Term term) termDelete (const Term term)
@ -450,13 +476,13 @@ termDelete (const Term term)
} }
} }
/* //! Normalize a term with respect to tupling.
termNormalize /**
* Avoids problems with associativity by rewriting every ((x,y),z) to
avoids problems with associativity by rewriting every ((x,y),z) to * (x,(y,z)), i.e. a normal form for terms, after which equality is
(x,y,z)), i.e. a normal form for terms, after which equality is * okay. No memory was allocated or deallocated, as only pointers are swapped.
okay. *
*/ *@return After execution, the term pointed at has been normalized. */
void void
termNormalize (Term term) termNormalize (Term term)
@ -493,7 +519,12 @@ termNormalize (Term term)
} }
} }
//! Copy a term, and ensure all run identifiers are set to the new value.
/**
* Strange code. Only to be used on locals, as is stupidly replaces all run identifiers.
*@return The new term.
*\sa termDuplicate()
*/
Term Term
termRunid (Term term, int runid) termRunid (Term term, int runid)
{ {
@ -527,8 +558,10 @@ termRunid (Term term, int runid)
} }
} }
/* tupleCount yields the size of the top tuple in the term */ //! Determine tuple width of a given term.
/**
*\sa tupleProject()
*/
int int
tupleCount (Term tt) tupleCount (Term tt)
{ {
@ -550,9 +583,13 @@ tupleCount (Term tt)
} }
} }
/* tupleProject yields the projection pi (0 .. n-1) on a top tuple. Returns //! Yield the projection Pi(n) of a term.
* NULL if the range is incorrect. */ /**
*@param tt Term
*@param n The index in the tuple.
*@return Returns either a pointer to a term, or NULL if the index is out of range.
*\sa tupleCount()
*/
Term Term
tupleProject (Term tt, int n) tupleProject (Term tt, int n)
{ {
@ -591,9 +628,12 @@ tupleProject (Term tt, int n)
} }
} }
/* number of elements in a term. //! Determine size of term.
* /**
* Determines the size of a term according to some heuristic.
* Currently, the encryption operator is weighed as well. * Currently, the encryption operator is weighed as well.
*@return Returns a nonnegative integer.
*\sa termDistance()
*/ */
int int
@ -622,7 +662,10 @@ termSize(Term t)
} }
} }
/* Yield some sort of distance between two terms, as a float between 0 and 1. //! Determine distance between two terms.
/**
*@return A float value between 0, completely dissimilar, and 1, equal.
*\sa termSize()
*/ */
float float

View File

@ -9,31 +9,53 @@
#define ENCRYPT 4 #define ENCRYPT 4
#define TUPLE 5 #define TUPLE 5
//! The most basic datatype in the modelchecker.
/**
* Describes a single term.
*/
struct term struct term
{ {
/* basic : name,runid /* basic : name,runid
encrypt: op,key encrypt: op,key
tuple : op,next tuple : op,next
*/ */
//! The type of term.
/**
* \sa GLOBAL, VARIABLE, LEAF, ENCRYPT, TUPLE
*/
int type; int type;
void *stype; // only for leaf, termlist pointer //! Data Type termlist (e.g. agent or nonce)
/** Only for leaves. */
void *stype;
//! Substitution term.
/**
* If this is non-NULL, this leaf term is apparently substituted by
* this term.
*/
struct term *subst; // only for variable/leaf, substitution term struct term *subst; // only for variable/leaf, substitution term
union union
{ {
Symbol symb; Symbol symb;
//! Encrypted subterm.
struct term *op; struct term *op;
//! Left-hand side of tuple pair.
struct term *op1; struct term *op1;
struct term *next; // for alternative memory management struct term *next; // for alternative memory management
}; };
union union
{ {
int runid; int runid;
//! Key used to encrypt subterm.
struct term *key; struct term *key;
//! Right-hand side of tuple pair.
struct term *op2; struct term *op2;
}; };
}; };
//! Pointer shorthand.
typedef struct term *Term; typedef struct term *Term;
void termsInit (void); void termsInit (void);