private static ImmutableDictionary <IParameterSymbol, SyntaxNode> GetOrComputeHazardousParameterUsages( IBlockOperation topmostBlock, Compilation compilation, ISymbol owningSymbol, AnalyzerOptions analyzerOptions, SymbolNamesOption nullCheckValidationMethods, InterproceduralAnalysisConfiguration interproceduralAnalysisConfig, bool performCopyAnalysis, bool pessimisticAnalysis = true) { var cfg = topmostBlock.GetEnclosingControlFlowGraph(); if (cfg == null) { return(ImmutableDictionary <IParameterSymbol, SyntaxNode> .Empty); } var wellKnownTypeProvider = WellKnownTypeProvider.GetOrCreate(compilation); var pointsToAnalysisResult = PointsToAnalysis.PointsToAnalysis.TryGetOrComputeResult(cfg, owningSymbol, analyzerOptions, wellKnownTypeProvider, interproceduralAnalysisConfig, interproceduralAnalysisPredicateOpt: null, pessimisticAnalysis, performCopyAnalysis); if (pointsToAnalysisResult != null) { var result = TryGetOrComputeResult(cfg, owningSymbol, analyzerOptions, wellKnownTypeProvider, nullCheckValidationMethods, interproceduralAnalysisConfig, pessimisticAnalysis, pointsToAnalysisResult); if (result != null) { return(result.HazardousParameterUsages); } } return(ImmutableDictionary <IParameterSymbol, SyntaxNode> .Empty); }
internal static DisposeAnalysisContext Create( AbstractValueDomain <DisposeAbstractValue> valueDomain, WellKnownTypeProvider wellKnownTypeProvider, ControlFlowGraph controlFlowGraph, ISymbol owningSymbol, AnalyzerOptions analyzerOptions, InterproceduralAnalysisConfiguration interproceduralAnalysisConfig, InterproceduralAnalysisPredicate?interproceduralAnalysisPredicateOpt, bool pessimisticAnalysis, bool exceptionPathsAnalysis, PointsToAnalysisResult?pointsToAnalysisResultOpt, Func <DisposeAnalysisContext, DisposeAnalysisResult?> tryGetOrComputeAnalysisResult, ImmutableHashSet <INamedTypeSymbol> disposeOwnershipTransferLikelyTypes, bool disposeOwnershipTransferAtConstructor, bool disposeOwnershipTransferAtMethodCall, bool trackInstanceFields, SymbolNamesOption excludedSymbols) { return(new DisposeAnalysisContext( valueDomain, wellKnownTypeProvider, controlFlowGraph, owningSymbol, analyzerOptions, interproceduralAnalysisConfig, pessimisticAnalysis, exceptionPathsAnalysis, pointsToAnalysisResultOpt, tryGetOrComputeAnalysisResult, disposeOwnershipTransferLikelyTypes, disposeOwnershipTransferAtConstructor, disposeOwnershipTransferAtMethodCall, trackInstanceFields, parentControlFlowGraphOpt: null, interproceduralAnalysisDataOpt: null, interproceduralAnalysisPredicateOpt, excludedSymbols)); }
private static ParameterValidationAnalysisResult?TryGetOrComputeResult( ControlFlowGraph cfg, ISymbol owningSymbol, AnalyzerOptions analyzerOptions, WellKnownTypeProvider wellKnownTypeProvider, SymbolNamesOption nullCheckValidationMethods, InterproceduralAnalysisConfiguration interproceduralAnalysisConfig, bool pessimisticAnalysis, PointsToAnalysisResult pointsToAnalysisResult) { var analysisContext = ParameterValidationAnalysisContext.Create(ParameterValidationAbstractValueDomain.Default, wellKnownTypeProvider, cfg, owningSymbol, analyzerOptions, nullCheckValidationMethods, interproceduralAnalysisConfig, pessimisticAnalysis, pointsToAnalysisResult, TryGetOrComputeResultForAnalysisContext); return(TryGetOrComputeResultForAnalysisContext(analysisContext)); }
public static ParameterValidationAnalysisContext Create( AbstractValueDomain <ParameterValidationAbstractValue> valueDomain, WellKnownTypeProvider wellKnownTypeProvider, ControlFlowGraph controlFlowGraph, ISymbol owningSymbol, SymbolNamesOption nullCheckValidationMethods, InterproceduralAnalysisConfiguration interproceduralAnalysisConfig, bool pessimisticAnalysis, PointsToAnalysisResult pointsToAnalysisResultOpt, Func <ParameterValidationAnalysisContext, ParameterValidationAnalysisResult> tryGetOrComputeAnalysisResult) { return(new ParameterValidationAnalysisContext( valueDomain, wellKnownTypeProvider, controlFlowGraph, owningSymbol, nullCheckValidationMethods, interproceduralAnalysisConfig, pessimisticAnalysis, pointsToAnalysisResultOpt, tryGetOrComputeAnalysisResult, parentControlFlowGraphOpt: null, interproceduralAnalysisDataOpt: null, trackHazardousParameterUsages: false)); }
private ParameterValidationAnalysisContext( AbstractValueDomain <ParameterValidationAbstractValue> valueDomain, WellKnownTypeProvider wellKnownTypeProvider, ControlFlowGraph controlFlowGraph, ISymbol owningSymbol, SymbolNamesOption nullCheckValidationMethods, InterproceduralAnalysisConfiguration interproceduralAnalysisConfig, bool pessimisticAnalysis, PointsToAnalysisResult pointsToAnalysisResultOpt, Func <ParameterValidationAnalysisContext, ParameterValidationAnalysisResult> tryGetOrComputeAnalysisResult, ControlFlowGraph parentControlFlowGraphOpt, InterproceduralParameterValidationAnalysisData interproceduralAnalysisDataOpt, bool trackHazardousParameterUsages) : base(valueDomain, wellKnownTypeProvider, controlFlowGraph, owningSymbol, interproceduralAnalysisConfig, pessimisticAnalysis, predicateAnalysis: false, exceptionPathsAnalysis: false, copyAnalysisResultOpt: null, pointsToAnalysisResultOpt, valueContentAnalysisResultOpt: null, tryGetOrComputeAnalysisResult, parentControlFlowGraphOpt, interproceduralAnalysisDataOpt, interproceduralAnalysisPredicateOpt: null) { TrackHazardousParameterUsages = trackHazardousParameterUsages; NullCheckValidationMethodNames = nullCheckValidationMethods; }
private static DisposeAnalysisResult?TryGetOrComputeResult( ControlFlowGraph cfg, ISymbol owningSymbol, AnalyzerOptions analyzerOptions, WellKnownTypeProvider wellKnownTypeProvider, InterproceduralAnalysisConfiguration interproceduralAnalysisConfig, InterproceduralAnalysisPredicate?interproceduralAnalysisPredicateOpt, ImmutableHashSet <INamedTypeSymbol> disposeOwnershipTransferLikelyTypes, bool disposeOwnershipTransferAtConstructor, bool disposeOwnershipTransferAtMethodCall, bool trackInstanceFields, bool exceptionPathsAnalysis, bool performCopyAnalysis, SymbolNamesOption excludedSymbols, out PointsToAnalysisResult?pointsToAnalysisResult) { Debug.Assert(wellKnownTypeProvider.TryGetOrCreateTypeByMetadataName(WellKnownTypeNames.SystemIDisposable, out _)); pointsToAnalysisResult = PointsToAnalysis.PointsToAnalysis.TryGetOrComputeResult( cfg, owningSymbol, analyzerOptions, wellKnownTypeProvider, interproceduralAnalysisConfig, interproceduralAnalysisPredicateOpt, PessimisticAnalysis, performCopyAnalysis, exceptionPathsAnalysis); if (pointsToAnalysisResult == null) { return(null); } if (cfg == null) { Debug.Fail("Expected non-null CFG"); return(null); } var analysisContext = DisposeAnalysisContext.Create( DisposeAbstractValueDomain.Default, wellKnownTypeProvider, cfg, owningSymbol, analyzerOptions, interproceduralAnalysisConfig, interproceduralAnalysisPredicateOpt, PessimisticAnalysis, exceptionPathsAnalysis, pointsToAnalysisResult, TryGetOrComputeResultForAnalysisContext, disposeOwnershipTransferLikelyTypes, disposeOwnershipTransferAtConstructor, disposeOwnershipTransferAtMethodCall, trackInstanceFields, excludedSymbols); return(TryGetOrComputeResultForAnalysisContext(analysisContext)); }
private DisposeAnalysisContext( AbstractValueDomain <DisposeAbstractValue> valueDomain, WellKnownTypeProvider wellKnownTypeProvider, ControlFlowGraph controlFlowGraph, ISymbol owningSymbol, AnalyzerOptions analyzerOptions, InterproceduralAnalysisConfiguration interproceduralAnalysisConfig, bool pessimisticAnalysis, bool exceptionPathsAnalysis, PointsToAnalysisResult?pointsToAnalysisResultOpt, Func <DisposeAnalysisContext, DisposeAnalysisResult?> tryGetOrComputeAnalysisResult, ImmutableHashSet <INamedTypeSymbol> disposeOwnershipTransferLikelyTypes, bool disposeOwnershipTransferAtConstructor, bool disposeOwnershipTransferAtMethodCall, bool trackInstanceFields, ControlFlowGraph?parentControlFlowGraphOpt, InterproceduralDisposeAnalysisData?interproceduralAnalysisDataOpt, InterproceduralAnalysisPredicate?interproceduralAnalysisPredicateOpt, SymbolNamesOption excludedSymbols) : base(valueDomain, wellKnownTypeProvider, controlFlowGraph, owningSymbol, analyzerOptions, interproceduralAnalysisConfig, pessimisticAnalysis, predicateAnalysis: false, exceptionPathsAnalysis, copyAnalysisResultOpt: null, pointsToAnalysisResultOpt, valueContentAnalysisResultOpt: null, tryGetOrComputeAnalysisResult, parentControlFlowGraphOpt, interproceduralAnalysisDataOpt, interproceduralAnalysisPredicateOpt) { DisposeOwnershipTransferLikelyTypes = disposeOwnershipTransferLikelyTypes; DisposeOwnershipTransferAtConstructor = disposeOwnershipTransferAtConstructor; DisposeOwnershipTransferAtMethodCall = disposeOwnershipTransferAtMethodCall; TrackInstanceFields = trackInstanceFields; ExcludedSymbols = excludedSymbols; }