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,