コード例 #1
0
ファイル: TaintAnalysis.cs プロジェクト: river0825/Eir
        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));
        }