private static ParameterValidationAnalysisResult?TryGetOrComputeResultForAnalysisContext(ParameterValidationAnalysisContext analysisContext) { var operationVisitor = new ParameterValidationDataFlowOperationVisitor(analysisContext); var analysis = new ParameterValidationAnalysis(ParameterValidationAnalysisDomainInstance, operationVisitor); return(analysis.TryGetOrComputeResultCore(analysisContext, cacheResult: true)); }
protected override ParameterValidationAnalysisResult ToResult( ParameterValidationAnalysisContext analysisContext, DataFlowAnalysisResult <ParameterValidationBlockAnalysisResult, ParameterValidationAbstractValue> dataFlowAnalysisResult) { analysisContext = analysisContext.WithTrackHazardousParameterUsages(); var newOperationVisitor = new ParameterValidationDataFlowOperationVisitor(analysisContext); foreach (var block in analysisContext.ControlFlowGraph.Blocks) { var data = new ParameterValidationAnalysisData(dataFlowAnalysisResult[block].Data); data = Flow(newOperationVisitor, block, data); if (block.FallThroughSuccessor != null) { var fallThroughData = block.ConditionalSuccessor != null?AnalysisDomain.Clone(data) : data; _ = FlowBranch(newOperationVisitor, block.FallThroughSuccessor, fallThroughData); } if (block.ConditionalSuccessor != null) { _ = FlowBranch(newOperationVisitor, block.ConditionalSuccessor, data); } } return(new ParameterValidationAnalysisResult(dataFlowAnalysisResult, newOperationVisitor.HazardousParameterUsages)); }
private static ParameterValidationResultWithHazardousUsages GetOrComputeResult( ControlFlowGraph cfg, ISymbol owningSymbol, WellKnownTypeProvider wellKnownTypeProvider, DataFlowAnalysisResult <NullAnalysis.NullBlockAnalysisResult, NullAnalysis.NullAbstractValue> nullAnalysisResult, DataFlowAnalysisResult <PointsToAnalysis.PointsToBlockAnalysisResult, PointsToAnalysis.PointsToAbstractValue> pointsToAnalysisResult, Func <IBlockOperation, IMethodSymbol, ParameterValidationResultWithHazardousUsages> getOrComputeLocationAnalysisResultOpt, bool pessimisticAnalysis) { var operationVisitor = new ParameterValidationDataFlowOperationVisitor(ParameterValidationAbstractValueDomain.Default, owningSymbol, wellKnownTypeProvider, getOrComputeLocationAnalysisResultOpt, nullAnalysisResult, pointsToAnalysisResult, pessimisticAnalysis); var analysis = new ParameterValidationAnalysis(ParameterValidationAnalysisDomainInstance, operationVisitor); var analysisResult = analysis.GetOrComputeResultCore(cfg, cacheResult: true); var newOperationVisitor = new ParameterValidationDataFlowOperationVisitor(ParameterValidationAbstractValueDomain.Default, owningSymbol, wellKnownTypeProvider, getOrComputeLocationAnalysisResultOpt, nullAnalysisResult, pointsToAnalysisResult, pessimisticAnalysis, trackHazardousParameterUsages: true); var resultBuilder = new DataFlowAnalysisResultBuilder <ParameterValidationAnalysisData>(); foreach (var block in cfg.Blocks) { var data = ParameterValidationAnalysisDomainInstance.Clone(analysisResult[block].InputData); data = Flow(newOperationVisitor, block, data); } return(new ParameterValidationResultWithHazardousUsages(analysisResult, newOperationVisitor.HazardousParameterUsages)); }
private ParameterValidationAnalysis(ParameterValidationAnalysisDomain analysisDomain, ParameterValidationDataFlowOperationVisitor operationVisitor) : base(analysisDomain, operationVisitor) { }