From f2d5870916d8d73d8593de98f8bc866b8e850be0 Mon Sep 17 00:00:00 2001 From: Paul Ming Date: Fri, 22 Nov 2019 16:38:34 -0800 Subject: [PATCH] Lazily creating CFG --- .../SourceTriggeredTaintedDataAnalyzerBase.cs | 29 +++++++++++++------ 1 file changed, 20 insertions(+), 9 deletions(-) diff --git a/src/Microsoft.NetCore.Analyzers/Core/Security/SourceTriggeredTaintedDataAnalyzerBase.cs b/src/Microsoft.NetCore.Analyzers/Core/Security/SourceTriggeredTaintedDataAnalyzerBase.cs index ab4e42ff5e..188c506b11 100644 --- a/src/Microsoft.NetCore.Analyzers/Core/Security/SourceTriggeredTaintedDataAnalyzerBase.cs +++ b/src/Microsoft.NetCore.Analyzers/Core/Security/SourceTriggeredTaintedDataAnalyzerBase.cs @@ -76,23 +76,24 @@ public override void Initialize(AnalysisContext context) return; } - ControlFlowGraph cfg = operationBlockStartContext.OperationBlocks.GetControlFlowGraph(); - if (cfg == null) - { - return; - } - WellKnownTypeProvider wellKnownTypeProvider = WellKnownTypeProvider.GetOrCreate(compilation); InterproceduralAnalysisConfiguration interproceduralAnalysisConfiguration = InterproceduralAnalysisConfiguration.Create( options, SupportedDiagnostics, defaultInterproceduralAnalysisKind: InterproceduralAnalysisKind.ContextSensitive, cancellationToken: cancellationToken); + Lazy controlFlowGraphFactory = new Lazy( + () => operationBlockStartContext.OperationBlocks.GetControlFlowGraph()); Lazy pointsToFactory = new Lazy( () => { + if (controlFlowGraphFactory.Value == null) + { + return null; + } + return PointsToAnalysis.TryGetOrComputeResult( - cfg, + controlFlowGraphFactory.Value, owningSymbol, options, wellKnownTypeProvider, @@ -102,8 +103,13 @@ public override void Initialize(AnalysisContext context) Lazy<(PointsToAnalysisResult, ValueContentAnalysisResult)> valueContentFactory = new Lazy<(PointsToAnalysisResult, ValueContentAnalysisResult)>( () => { + if (controlFlowGraphFactory.Value == null) + { + return (null, null); + } + ValueContentAnalysisResult valuecontentAnalysisResult = ValueContentAnalysis.TryGetOrComputeResult( - cfg, + controlFlowGraphFactory.Value, owningSymbol, options, wellKnownTypeProvider, @@ -179,10 +185,15 @@ public override void Initialize(AnalysisContext context) return; } + if (controlFlowGraphFactory.Value == null) + { + return; + } + foreach (IOperation rootOperation in rootOperationsNeedingAnalysis) { TaintedDataAnalysisResult taintedDataAnalysisResult = TaintedDataAnalysis.TryGetOrComputeResult( - cfg, + controlFlowGraphFactory.Value, operationBlockAnalysisContext.Compilation, operationBlockAnalysisContext.OwningSymbol, operationBlockAnalysisContext.Options,