[analyzer] Refactor node generation to use less code.

llvm-svn: 141133
This commit is contained in:
Anna Zaks 2011-10-04 23:12:04 +00:00
parent 7ba069074a
commit 1cc7655794
1 changed files with 11 additions and 28 deletions

View File

@ -114,12 +114,7 @@ public:
/// \brief Generate a default checker node (containing checker tag but no
/// checker state changes).
ExplodedNode *generateNode(bool autoTransition = true) {
assert(statement && "Only transitions with statements currently supported");
ExplodedNode *N = generateNodeImpl(statement, getState(), false,
checkerTag);
if (N && autoTransition)
Dst.Add(N);
return N;
return generateNode(getState(), autoTransition);
}
/// \brief Generate a new checker node with the given predecessor.
@ -127,8 +122,7 @@ public:
ExplodedNode *generateNode(const ProgramState *state,
ExplodedNode *pred,
bool autoTransition = true) {
assert(statement && "Only transitions with statements currently supported");
ExplodedNode *N = generateNodeImpl(statement, state, pred, false);
ExplodedNode *N = generateNodeImpl(state, false, pred);
if (N && autoTransition)
addTransition(N);
return N;
@ -138,9 +132,7 @@ public:
ExplodedNode *generateNode(const ProgramState *state,
bool autoTransition = true,
const ProgramPointTag *tag = 0) {
assert(statement && "Only transitions with statements currently supported");
ExplodedNode *N = generateNodeImpl(statement, state, false,
tag ? tag : checkerTag);
ExplodedNode *N = generateNodeImpl(state, false, 0, tag);
if (N && autoTransition)
addTransition(N);
return N;
@ -149,9 +141,7 @@ public:
/// \brief Generate a sink node. Generating sink stops exploration of the
/// given path.
ExplodedNode *generateSink(const ProgramState *state = 0) {
assert(statement && "Only transitions with statements currently supported");
return generateNodeImpl(statement, state ? state : getState(), true,
checkerTag);
return generateNodeImpl(state ? state : getState(), true);
}
void addTransition(ExplodedNode *node) {
@ -179,21 +169,14 @@ public:
}
private:
ExplodedNode *generateNodeImpl(const Stmt *stmt,
const ProgramState *state,
ExplodedNode *generateNodeImpl(const ProgramState *state,
bool markAsSink,
const ProgramPointTag *tag) {
ExplodedNode *node = B.generateNode(stmt, state, Pred, tag);
if (markAsSink && node)
node->markAsSink();
return node;
}
ExplodedNode *generateNodeImpl(const Stmt *stmt,
const ProgramState *state,
ExplodedNode *pred,
bool markAsSink) {
ExplodedNode *node = B.generateNode(stmt, state, pred, checkerTag);
ExplodedNode *pred = 0,
const ProgramPointTag *tag = 0) {
assert(statement && "Only transitions with statements currently supported");
ExplodedNode *node = B.generateNode(statement, state,
pred ? pred : Pred,
tag ? tag : checkerTag);
if (markAsSink && node)
node->markAsSink();
return node;