private CFGTaintInfo AnalyzeNode(TaggedEdge<CFGBlock, EdgeTag> edge)
{
var oldTaint = Taints[edge.Target];
// IN:
// ∪ TAINT_OUT( l')
// (l'~>l)
var newInTaint = oldTaint.In.Merge(Taints[edge.Source].Out[edge.Tag.EdgeType]);
// OUT:
// ( TAINT_IN(l) \ KILL(l) ) ∪ GEN(l)
ImmutableDictionary<EdgeType, ImmutableVariableStorage> newOutTaint;
if (edge.Target.AstEntryNode == null)
{
newOutTaint = ImmutableDictionary<EdgeType, ImmutableVariableStorage>.Empty.Add(EdgeType.Normal, newInTaint);
}
else
{
//var blockTaintAnalyzer = new TaintBlockVisitor(null, newInTaint);
//var astTraverser = new XmlTraverser();
//astTraverser.AddVisitor(blockTaintAnalyzer);
//astTraverser.Traverse(edge.Target.AstEntryNode);
var newOut =_blockAnalyzer.Analyze(edge.Target.AstEntryNode, newInTaint);
var newOutWithCondSani = _conditionTaintAnalyser.AnalyzeCond(edge.Target.AstEntryNode, newOut);
newOutTaint = newOutWithCondSani.ToImmutableDictionary();
}
return new CFGTaintInfo(newInTaint, newOutTaint);
}