private CFGTaintInfo AnalyzeNode2(CFGBlock block, IBidirectionalGraph <CFGBlock, TaggedEdge <CFGBlock, EdgeTag> > graph) { var oldTaint = Taints[block]; var predecessorsOut = graph.InEdges(block); var outTaints = predecessorsOut.Select(p => new { EdgeType = p.Tag, Source = p.Source }) .Where(s => Taints[s.Source].Out != null && Taints[s.Source].Out.Any()) .Select(s => Taints[s.Source].Out[s.EdgeType.EdgeType]) .Where(o => o != null); ImmutableVariableStorage newInTaint; if (outTaints.Any()) { newInTaint = oldTaint.In.Merge(outTaints.Aggregate((current, next) => current.Merge(next))); } else { newInTaint = oldTaint.In; } ImmutableDictionary <EdgeType, ImmutableVariableStorage> newOutTaint; if (block.AstEntryNode == null) { newOutTaint = ImmutableDictionary <EdgeType, ImmutableVariableStorage> .Empty.Add(EdgeType.Normal, newInTaint); } else { var newOut = _blockAnalyzer.Analyze(block.AstEntryNode, newInTaint); var newOutWithCondSani = _conditionTaintAnalyser.AnalyzeCond(block.AstEntryNode, newOut); newOutTaint = newOutWithCondSani.ToImmutableDictionary(); } return(new CFGTaintInfo(newInTaint, newOutTaint)); }