コード例 #1
0
        public override PropertySetAnalysisContext ForkForInterproceduralAnalysis(
            IMethodSymbol invokedMethod,
            ControlFlowGraph invokedCfg,
            IOperation operation,
            PointsToAnalysisResult pointsToAnalysisResultOpt,
            CopyAnalysisResult copyAnalysisResultOpt,
            ValueContentAnalysisResult valueContentAnalysisResultOpt,
            InterproceduralPropertySetAnalysisData interproceduralAnalysisData)
        {
            Debug.Assert(pointsToAnalysisResultOpt != null);
            Debug.Assert(copyAnalysisResultOpt == null);

            return(new PropertySetAnalysisContext(
                       ValueDomain,
                       WellKnownTypeProvider,
                       invokedCfg,
                       invokedMethod,
                       InterproceduralAnalysisConfiguration,
                       PessimisticAnalysis,
                       pointsToAnalysisResultOpt,
                       valueContentAnalysisResultOpt,
                       GetOrComputeAnalysisResult,
                       ControlFlowGraph,
                       interproceduralAnalysisData,
                       this.TypeToTrackMetadataName,
                       this.ConstructorMapper,
                       this.PropertyMappers,
                       this.HazardousUsageEvaluators,
                       this.HazardousUsageTypesToNames));
        }
コード例 #2
0
 public abstract TAnalysisContext ForkForInterproceduralAnalysis(
     IMethodSymbol invokedMethod,
     ControlFlowGraph invokedCfg,
     IOperation operation,
     PointsToAnalysisResult pointsToAnalysisResultOpt,
     CopyAnalysisResult copyAnalysisResultOpt,
     InterproceduralAnalysisData <TAnalysisData, TAnalysisContext, TAbstractAnalysisValue> interproceduralAnalysisData);
コード例 #3
0
        public static ValueContentAnalysisResult TryGetOrComputeResult(
            ControlFlowGraph cfg,
            ISymbol owningSymbol,
            WellKnownTypeProvider wellKnownTypeProvider,
            AnalyzerOptions analyzerOptions,
            DiagnosticDescriptor rule,
            CancellationToken cancellationToken,
            out CopyAnalysisResult copyAnalysisResultOpt,
            out PointsToAnalysisResult pointsToAnalysisResultOpt,
            InterproceduralAnalysisKind interproceduralAnalysisKind = InterproceduralAnalysisKind.None,
            bool pessimisticAnalysis     = true,
            bool performPointsToAnalysis = true,
            bool performCopyAnalysisIfNotUserConfigured = false,
            InterproceduralAnalysisPredicate interproceduralAnalysisPredicateOpt = null)
        {
            Debug.Assert(!owningSymbol.IsConfiguredToSkipAnalysis(analyzerOptions, rule, wellKnownTypeProvider.Compilation, cancellationToken));

            var interproceduralAnalysisConfig = InterproceduralAnalysisConfiguration.Create(
                analyzerOptions, rule, interproceduralAnalysisKind, cancellationToken);

            return(TryGetOrComputeResult(cfg, owningSymbol, analyzerOptions, wellKnownTypeProvider,
                                         interproceduralAnalysisConfig, out copyAnalysisResultOpt,
                                         out pointsToAnalysisResultOpt, pessimisticAnalysis, performPointsToAnalysis,
                                         performCopyAnalysis: analyzerOptions.GetCopyAnalysisOption(rule, defaultValue: performCopyAnalysisIfNotUserConfigured, cancellationToken),
                                         interproceduralAnalysisPredicateOpt: interproceduralAnalysisPredicateOpt));
        }
コード例 #4
0
        internal static ValueContentAnalysisResult TryGetOrComputeResult(
            ControlFlowGraph cfg,
            ISymbol owningSymbol,
            AnalyzerOptions analyzerOptions,
            WellKnownTypeProvider wellKnownTypeProvider,
            InterproceduralAnalysisConfiguration interproceduralAnalysisConfig,
            out CopyAnalysisResult copyAnalysisResultOpt,
            out PointsToAnalysisResult pointsToAnalysisResultOpt,
            bool pessimisticAnalysis     = true,
            bool performPointsToAnalysis = true,
            bool performCopyAnalysis     = false,
            InterproceduralAnalysisPredicate interproceduralAnalysisPredicateOpt = null)
        {
            copyAnalysisResultOpt     = null;
            pointsToAnalysisResultOpt = performPointsToAnalysis ?
                                        PointsToAnalysis.PointsToAnalysis.TryGetOrComputeResult(cfg, owningSymbol, analyzerOptions, wellKnownTypeProvider, out copyAnalysisResultOpt,
                                                                                                interproceduralAnalysisConfig, interproceduralAnalysisPredicateOpt, pessimisticAnalysis, performCopyAnalysis) :
                                        null;

            if (cfg == null)
            {
                Debug.Fail("Expected non-null CFG");
                return(null);
            }

            var analysisContext = ValueContentAnalysisContext.Create(
                ValueContentAbstractValueDomain.Default, wellKnownTypeProvider, cfg, owningSymbol, analyzerOptions,
                interproceduralAnalysisConfig, pessimisticAnalysis, copyAnalysisResultOpt,
                pointsToAnalysisResultOpt, TryGetOrComputeResultForAnalysisContext, interproceduralAnalysisPredicateOpt);

            return(TryGetOrComputeResultForAnalysisContext(analysisContext));
        }
コード例 #5
0
 public override ValueContentAnalysisContext ForkForInterproceduralAnalysis(
     IMethodSymbol invokedMethod,
     ControlFlowGraph invokedControlFlowGraph,
     IOperation operation,
     PointsToAnalysisResult pointsToAnalysisResultOpt,
     CopyAnalysisResult copyAnalysisResultOpt,
     InterproceduralValueContentAnalysisData interproceduralAnalysisData)
 {
     return(new ValueContentAnalysisContext(ValueDomain, WellKnownTypeProvider, invokedControlFlowGraph, invokedMethod, InterproceduralAnalysisConfiguration,
                                            PessimisticAnalysis, copyAnalysisResultOpt, pointsToAnalysisResultOpt, GetOrComputeAnalysisResult, ControlFlowGraph, interproceduralAnalysisData,
                                            InterproceduralAnalysisPredicateOpt));
 }
コード例 #6
0
        protected AbstractDataFlowAnalysisContext(
            AbstractValueDomain <TAbstractAnalysisValue> valueDomain,
            WellKnownTypeProvider wellKnownTypeProvider,
            ControlFlowGraph controlFlowGraph,
            ISymbol owningSymbol,
            AnalyzerOptions analyzerOptions,
            InterproceduralAnalysisConfiguration interproceduralAnalysisConfig,
            bool pessimisticAnalysis,
            bool predicateAnalysis,
            bool exceptionPathsAnalysis,
            CopyAnalysisResult copyAnalysisResultOpt,
            PointsToAnalysisResult pointsToAnalysisResultOpt,
            ValueContentAnalysisResult valueContentAnalysisResultOpt,
            Func <TAnalysisContext, TAnalysisResult> tryGetOrComputeAnalysisResult,
            ControlFlowGraph parentControlFlowGraphOpt,
            InterproceduralAnalysisData <TAnalysisData, TAnalysisContext, TAbstractAnalysisValue> interproceduralAnalysisDataOpt,
            InterproceduralAnalysisPredicate interproceduralAnalysisPredicateOpt)
        {
            Debug.Assert(valueDomain != null, "valueDomain must not be null for use in ComputeHashCodeParts");
            Debug.Assert(controlFlowGraph != null);
            Debug.Assert(owningSymbol != null);
            Debug.Assert(owningSymbol.Kind == SymbolKind.Method ||
                         owningSymbol.Kind == SymbolKind.Field ||
                         owningSymbol.Kind == SymbolKind.Property ||
                         owningSymbol.Kind == SymbolKind.Event);
            Debug.Assert(Equals(owningSymbol.OriginalDefinition, owningSymbol));
            Debug.Assert(wellKnownTypeProvider != null);
            Debug.Assert(tryGetOrComputeAnalysisResult != null);
            Debug.Assert(pointsToAnalysisResultOpt == null ||
                         pointsToAnalysisResultOpt.ControlFlowGraph == controlFlowGraph);
            Debug.Assert(copyAnalysisResultOpt == null ||
                         copyAnalysisResultOpt.ControlFlowGraph == controlFlowGraph);
            Debug.Assert(valueContentAnalysisResultOpt == null ||
                         valueContentAnalysisResultOpt.ControlFlowGraph == controlFlowGraph);

            ValueDomain                          = valueDomain;
            WellKnownTypeProvider                = wellKnownTypeProvider;
            ControlFlowGraph                     = controlFlowGraph;
            ParentControlFlowGraphOpt            = parentControlFlowGraphOpt;
            OwningSymbol                         = owningSymbol;
            AnalyzerOptions                      = analyzerOptions;
            InterproceduralAnalysisConfiguration = interproceduralAnalysisConfig;
            PessimisticAnalysis                  = pessimisticAnalysis;
            PredicateAnalysis                    = predicateAnalysis;
            ExceptionPathsAnalysis               = exceptionPathsAnalysis;
            CopyAnalysisResultOpt                = copyAnalysisResultOpt;
            PointsToAnalysisResultOpt            = pointsToAnalysisResultOpt;
            ValueContentAnalysisResultOpt        = valueContentAnalysisResultOpt;
            TryGetOrComputeAnalysisResult        = tryGetOrComputeAnalysisResult;
            InterproceduralAnalysisDataOpt       = interproceduralAnalysisDataOpt;
            InterproceduralAnalysisPredicateOpt  = interproceduralAnalysisPredicateOpt;
        }
コード例 #7
0
        public override PointsToAnalysisContext ForkForInterproceduralAnalysis(
            IMethodSymbol invokedMethod,
            ControlFlowGraph invokedControlFlowGraph,
            IOperation operation,
            PointsToAnalysisResult pointsToAnalysisResultOpt,
            CopyAnalysisResult copyAnalysisResultOpt,
            InterproceduralPointsToAnalysisData interproceduralAnalysisData)
        {
            Debug.Assert(pointsToAnalysisResultOpt == null);

            return(new PointsToAnalysisContext(ValueDomain, WellKnownTypeProvider, invokedControlFlowGraph, invokedMethod, InterproceduralAnalysisConfiguration,
                                               PessimisticAnalysis, ExceptionPathsAnalysis, copyAnalysisResultOpt, GetOrComputeAnalysisResult, ControlFlowGraph, interproceduralAnalysisData,
                                               InterproceduralAnalysisPredicateOpt));
        }
コード例 #8
0
        public override DisposeAnalysisContext ForkForInterproceduralAnalysis(
            IMethodSymbol invokedMethod,
            ControlFlowGraph invokedControlFlowGraph,
            IOperation operation,
            PointsToAnalysisResult pointsToAnalysisResultOpt,
            CopyAnalysisResult copyAnalysisResultOpt,
            InterproceduralDisposeAnalysisData interproceduralAnalysisData)
        {
            Debug.Assert(pointsToAnalysisResultOpt != null);
            Debug.Assert(copyAnalysisResultOpt == null);

            return(new DisposeAnalysisContext(ValueDomain, WellKnownTypeProvider, invokedControlFlowGraph, invokedMethod, InterproceduralAnalysisConfiguration, PessimisticAnalysis,
                                              ExceptionPathsAnalysis, pointsToAnalysisResultOpt, GetOrComputeAnalysisResult, DisposeOwnershipTransferLikelyTypes, DisposeOwnershipTransferAtConstructor,
                                              TrackInstanceFields, ControlFlowGraph, interproceduralAnalysisData, InterproceduralAnalysisPredicateOpt));
        }
コード例 #9
0
 internal static PointsToAnalysisContext Create(
     AbstractValueDomain <PointsToAbstractValue> valueDomain,
     WellKnownTypeProvider wellKnownTypeProvider,
     ControlFlowGraph controlFlowGraph,
     ISymbol owningSymbol,
     InterproceduralAnalysisConfiguration interproceduralAnalysisConfig,
     bool pessimisticAnalysis,
     bool exceptionPathsAnalysis,
     CopyAnalysisResult copyAnalysisResultOpt,
     Func <PointsToAnalysisContext, PointsToAnalysisResult> getOrComputeAnalysisResult,
     InterproceduralAnalysisPredicate interproceduralAnalysisPredicateOpt)
 {
     return(new PointsToAnalysisContext(valueDomain, wellKnownTypeProvider, controlFlowGraph, owningSymbol, interproceduralAnalysisConfig,
                                        pessimisticAnalysis, exceptionPathsAnalysis, copyAnalysisResultOpt, getOrComputeAnalysisResult, parentControlFlowGraphOpt: null,
                                        interproceduralAnalysisDataOpt: null, interproceduralAnalysisPredicateOpt));
 }
コード例 #10
0
 protected sealed override void ComputeHashCodeParts(Action <int> addPart)
 {
     addPart(ValueDomain.GetHashCode());
     addPart(OwningSymbol.GetHashCode());
     addPart(ControlFlowGraph.GetHashCode());
     addPart(AnalyzerOptions.GetHashCode());
     addPart(InterproceduralAnalysisConfiguration.GetHashCode());
     addPart(PessimisticAnalysis.GetHashCode());
     addPart(PredicateAnalysis.GetHashCode());
     addPart(ExceptionPathsAnalysis.GetHashCode());
     addPart(CopyAnalysisResult.GetHashCodeOrDefault());
     addPart(PointsToAnalysisResult.GetHashCodeOrDefault());
     addPart(ValueContentAnalysisResult.GetHashCodeOrDefault());
     addPart(InterproceduralAnalysisData.GetHashCodeOrDefault());
     addPart(InterproceduralAnalysisPredicate.GetHashCodeOrDefault());
     ComputeHashCodePartsSpecific(addPart);
 }
コード例 #11
0
 protected sealed override void ComputeHashCodeParts(ref RoslynHashCode hashCode)
 {
     hashCode.Add(ValueDomain.GetHashCode());
     hashCode.Add(OwningSymbol.GetHashCode());
     hashCode.Add(ControlFlowGraph.GetHashCode());
     hashCode.Add(AnalyzerOptions.GetHashCode());
     hashCode.Add(InterproceduralAnalysisConfiguration.GetHashCode());
     hashCode.Add(PessimisticAnalysis.GetHashCode());
     hashCode.Add(PredicateAnalysis.GetHashCode());
     hashCode.Add(ExceptionPathsAnalysis.GetHashCode());
     hashCode.Add(CopyAnalysisResult.GetHashCodeOrDefault());
     hashCode.Add(PointsToAnalysisResult.GetHashCodeOrDefault());
     hashCode.Add(ValueContentAnalysisResult.GetHashCodeOrDefault());
     hashCode.Add(InterproceduralAnalysisData.GetHashCodeOrDefault());
     hashCode.Add(InterproceduralAnalysisPredicate.GetHashCodeOrDefault());
     ComputeHashCodePartsSpecific(ref hashCode);
 }
コード例 #12
0
        public override ParameterValidationAnalysisContext ForkForInterproceduralAnalysis(
            IMethodSymbol invokedMethod,
            ControlFlowGraph invokedCfg,
            IOperation operation,
            PointsToAnalysisResult pointsToAnalysisResultOpt,
            CopyAnalysisResult copyAnalysisResultOpt,
            InterproceduralParameterValidationAnalysisData interproceduralAnalysisData)
        {
            Debug.Assert(pointsToAnalysisResultOpt != null);
            Debug.Assert(copyAnalysisResultOpt == null);

            // Do not invoke any interprocedural analysis more than one level down.
            // We only care about analyzing validation methods.
            return(new ParameterValidationAnalysisContext(
                       ValueDomain, WellKnownTypeProvider, invokedCfg, invokedMethod, InterproceduralAnalysisConfiguration,
                       PessimisticAnalysis, pointsToAnalysisResultOpt, GetOrComputeAnalysisResult, ControlFlowGraph,
                       interproceduralAnalysisData, TrackHazardousParameterUsages));
        }
コード例 #13
0
 internal static ValueContentAnalysisContext Create(
     AbstractValueDomain <ValueContentAbstractValue> valueDomain,
     WellKnownTypeProvider wellKnownTypeProvider,
     ControlFlowGraph controlFlowGraph,
     ISymbol owningSymbol,
     AnalyzerOptions analyzerOptions,
     InterproceduralAnalysisConfiguration interproceduralAnalysisConfig,
     bool pessimisticAnalysis,
     CopyAnalysisResult copyAnalysisResultOpt,
     PointsToAnalysisResult pointsToAnalysisResultOpt,
     Func <ValueContentAnalysisContext, ValueContentAnalysisResult> tryGetOrComputeAnalysisResult,
     InterproceduralAnalysisPredicate interproceduralAnalysisPredicateOpt)
 {
     return(new ValueContentAnalysisContext(
                valueDomain, wellKnownTypeProvider, controlFlowGraph, owningSymbol, analyzerOptions,
                interproceduralAnalysisConfig, pessimisticAnalysis, copyAnalysisResultOpt, pointsToAnalysisResultOpt,
                tryGetOrComputeAnalysisResult, parentControlFlowGraphOpt: null, interproceduralAnalysisDataOpt: null, interproceduralAnalysisPredicateOpt));
 }
コード例 #14
0
 private PointsToAnalysisContext(
     AbstractValueDomain <PointsToAbstractValue> valueDomain,
     WellKnownTypeProvider wellKnownTypeProvider,
     ControlFlowGraph controlFlowGraph,
     ISymbol owningSymbol,
     InterproceduralAnalysisConfiguration interproceduralAnalysisConfig,
     bool pessimisticAnalysis,
     bool exceptionPathsAnalysis,
     CopyAnalysisResult copyAnalysisResultOpt,
     Func <PointsToAnalysisContext, PointsToAnalysisResult> getOrComputeAnalysisResult,
     ControlFlowGraph parentControlFlowGraphOpt,
     InterproceduralPointsToAnalysisData interproceduralAnalysisDataOpt,
     InterproceduralAnalysisPredicate interproceduralAnalysisPredicateOpt)
     : base(valueDomain, wellKnownTypeProvider, controlFlowGraph, owningSymbol, interproceduralAnalysisConfig, pessimisticAnalysis,
            predicateAnalysis: true, exceptionPathsAnalysis, copyAnalysisResultOpt, pointsToAnalysisResultOpt: null,
            getOrComputeAnalysisResult, parentControlFlowGraphOpt, interproceduralAnalysisDataOpt, interproceduralAnalysisPredicateOpt)
 {
 }
コード例 #15
0
        protected sealed override bool ComputeEqualsByHashCodeParts(CacheBasedEquatable <TAnalysisContext> obj)
        {
            var other = (AbstractDataFlowAnalysisContext <TAnalysisData, TAnalysisContext, TAnalysisResult, TAbstractAnalysisValue>)obj;

            return(ValueDomain.GetHashCode() == other.ValueDomain.GetHashCode() &&
                   OwningSymbol.GetHashCode() == other.OwningSymbol.GetHashCode() &&
                   ControlFlowGraph.GetHashCode() == other.ControlFlowGraph.GetHashCode() &&
                   AnalyzerOptions.GetHashCode() == other.AnalyzerOptions.GetHashCode() &&
                   InterproceduralAnalysisConfiguration.GetHashCode() == other.InterproceduralAnalysisConfiguration.GetHashCode() &&
                   PessimisticAnalysis.GetHashCode() == other.PessimisticAnalysis.GetHashCode() &&
                   PredicateAnalysis.GetHashCode() == other.PredicateAnalysis.GetHashCode() &&
                   ExceptionPathsAnalysis.GetHashCode() == other.ExceptionPathsAnalysis.GetHashCode() &&
                   CopyAnalysisResult.GetHashCodeOrDefault() == other.CopyAnalysisResult.GetHashCodeOrDefault() &&
                   PointsToAnalysisResult.GetHashCodeOrDefault() == other.PointsToAnalysisResult.GetHashCodeOrDefault() &&
                   ValueContentAnalysisResult.GetHashCodeOrDefault() == other.ValueContentAnalysisResult.GetHashCodeOrDefault() &&
                   InterproceduralAnalysisData.GetHashCodeOrDefault() == other.InterproceduralAnalysisData.GetHashCodeOrDefault() &&
                   InterproceduralAnalysisPredicate.GetHashCodeOrDefault() == other.InterproceduralAnalysisPredicate.GetHashCodeOrDefault() &&
                   ComputeEqualsByHashCodeParts(other));
        }
コード例 #16
0
        private TaintedDataAnalysisContext(
            AbstractValueDomain <TaintedDataAbstractValue> valueDomain,
            WellKnownTypeProvider wellKnownTypeProvider,
            ControlFlowGraph controlFlowGraph,
            ISymbol owningSymbol,
            AnalyzerOptions analyzerOptions,
            InterproceduralAnalysisConfiguration interproceduralAnalysisConfig,
            bool pessimisticAnalysis,
            CopyAnalysisResult copyAnalysisResultOpt,
            PointsToAnalysisResult pointsToAnalysisResult,
            ValueContentAnalysisResult valueContentAnalysisResult,
            Func <TaintedDataAnalysisContext, TaintedDataAnalysisResult> tryGetOrComputeAnalysisResult,
            ControlFlowGraph parentControlFlowGraph,
            InterproceduralTaintedDataAnalysisData interproceduralAnalysisDataOpt,
            TaintedDataSymbolMap <SourceInfo> taintedSourceInfos,
            TaintedDataSymbolMap <SanitizerInfo> taintedSanitizerInfos,
            TaintedDataSymbolMap <SinkInfo> taintedSinkInfos)
            : base(
                valueDomain,
                wellKnownTypeProvider,
                controlFlowGraph,
                owningSymbol,
                analyzerOptions,
                interproceduralAnalysisConfig,
                pessimisticAnalysis,
                predicateAnalysis: false,
                exceptionPathsAnalysis: false,
                copyAnalysisResultOpt,
                pointsToAnalysisResult,
                valueContentAnalysisResult,
                tryGetOrComputeAnalysisResult,
                parentControlFlowGraph,
                interproceduralAnalysisDataOpt,
                interproceduralAnalysisPredicateOpt: null)
        {
            Debug.Assert(pointsToAnalysisResult != null);

            this.SourceInfos    = taintedSourceInfos ?? throw new ArgumentNullException(nameof(taintedSourceInfos));
            this.SanitizerInfos = taintedSanitizerInfos ?? throw new ArgumentNullException(nameof(taintedSanitizerInfos));
            this.SinkInfos      = taintedSinkInfos ?? throw new ArgumentNullException(nameof(taintedSinkInfos));
        }
コード例 #17
0
        protected AbstractDataFlowAnalysisContext(
            AbstractValueDomain <TAbstractAnalysisValue> valueDomain,
            WellKnownTypeProvider wellKnownTypeProvider,
            ControlFlowGraph controlFlowGraph,
            ISymbol owningSymbol,
            InterproceduralAnalysisConfiguration interproceduralAnalysisConfig,
            bool pessimisticAnalysis,
            bool predicateAnalysis,
            bool exceptionPathsAnalysis,
            CopyAnalysisResult copyAnalysisResultOpt,
            PointsToAnalysisResult pointsToAnalysisResultOpt,
            Func <TAnalysisContext, TAnalysisResult> getOrComputeAnalysisResult,
            ControlFlowGraph parentControlFlowGraphOpt,
            InterproceduralAnalysisData <TAnalysisData, TAnalysisContext, TAbstractAnalysisValue> interproceduralAnalysisDataOpt,
            InterproceduralAnalysisPredicate interproceduralAnalysisPredicateOpt)
        {
            Debug.Assert(controlFlowGraph != null);
            Debug.Assert(owningSymbol != null);
            Debug.Assert(owningSymbol.Kind == SymbolKind.Method ||
                         owningSymbol.Kind == SymbolKind.Field ||
                         owningSymbol.Kind == SymbolKind.Property ||
                         owningSymbol.Kind == SymbolKind.Event);
            Debug.Assert(Equals(owningSymbol.OriginalDefinition, owningSymbol));
            Debug.Assert(wellKnownTypeProvider != null);
            Debug.Assert(getOrComputeAnalysisResult != null);

            ValueDomain                          = valueDomain;
            WellKnownTypeProvider                = wellKnownTypeProvider;
            ControlFlowGraph                     = controlFlowGraph;
            ParentControlFlowGraphOpt            = parentControlFlowGraphOpt;
            OwningSymbol                         = owningSymbol;
            InterproceduralAnalysisConfiguration = interproceduralAnalysisConfig;
            PessimisticAnalysis                  = pessimisticAnalysis;
            PredicateAnalysis                    = predicateAnalysis;
            ExceptionPathsAnalysis               = exceptionPathsAnalysis;
            CopyAnalysisResultOpt                = copyAnalysisResultOpt;
            PointsToAnalysisResultOpt            = pointsToAnalysisResultOpt;
            GetOrComputeAnalysisResult           = getOrComputeAnalysisResult;
            InterproceduralAnalysisDataOpt       = interproceduralAnalysisDataOpt;
            InterproceduralAnalysisPredicateOpt  = interproceduralAnalysisPredicateOpt;
        }
コード例 #18
0
        public static PointsToAnalysisResult TryGetOrComputeResult(
            ControlFlowGraph cfg,
            ISymbol owningSymbol,
            WellKnownTypeProvider wellKnownTypeProvider,
            out CopyAnalysisResult copyAnalysisResultOpt,
            InterproceduralAnalysisConfiguration interproceduralAnalysisConfig,
            InterproceduralAnalysisPredicate interproceduralAnalysisPredicateOpt,
            bool pessimisticAnalysis    = true,
            bool performCopyAnalysis    = true,
            bool exceptionPathsAnalysis = false)
        {
            copyAnalysisResultOpt = performCopyAnalysis ?
                                    CopyAnalysis.CopyAnalysis.TryGetOrComputeResult(cfg, owningSymbol, wellKnownTypeProvider, interproceduralAnalysisConfig,
                                                                                    interproceduralAnalysisPredicateOpt, pessimisticAnalysis, performPointsToAnalysis: true, exceptionPathsAnalysis) :
                                    null;
            var analysisContext = PointsToAnalysisContext.Create(PointsToAbstractValueDomain.Default, wellKnownTypeProvider, cfg,
                                                                 owningSymbol, interproceduralAnalysisConfig, pessimisticAnalysis, exceptionPathsAnalysis, copyAnalysisResultOpt,
                                                                 TryGetOrComputeResultForAnalysisContext, interproceduralAnalysisPredicateOpt);

            return(TryGetOrComputeResultForAnalysisContext(analysisContext));
        }
コード例 #19
0
        public static TaintedDataAnalysisContext Create(
            AbstractValueDomain <TaintedDataAbstractValue> valueDomain,
            WellKnownTypeProvider wellKnownTypeProvider,
            ControlFlowGraph controlFlowGraph,
            ISymbol owningSymbol,
            AnalyzerOptions analyzerOptions,
            InterproceduralAnalysisConfiguration interproceduralAnalysisConfig,
            bool pessimisticAnalysis,
            CopyAnalysisResult copyAnalysisResultOpt,
            PointsToAnalysisResult pointsToAnalysisResult,
            ValueContentAnalysisResult valueContentAnalysisResult,
            Func <TaintedDataAnalysisContext, TaintedDataAnalysisResult> tryGetOrComputeAnalysisResult,
            TaintedDataSymbolMap <SourceInfo> taintedSourceInfos,
            TaintedDataSymbolMap <SanitizerInfo> taintedSanitizerInfos,
            TaintedDataSymbolMap <SinkInfo> taintedSinkInfos)
        {
            Debug.Assert(pointsToAnalysisResult != null);

            return(new TaintedDataAnalysisContext(
                       valueDomain,
                       wellKnownTypeProvider,
                       controlFlowGraph,
                       owningSymbol,
                       analyzerOptions,
                       interproceduralAnalysisConfig,
                       pessimisticAnalysis,
                       copyAnalysisResultOpt,
                       pointsToAnalysisResult,
                       valueContentAnalysisResult,
                       tryGetOrComputeAnalysisResult,
                       parentControlFlowGraph: null,
                       interproceduralAnalysisDataOpt: null,
                       taintedSourceInfos: taintedSourceInfos,
                       taintedSanitizerInfos: taintedSanitizerInfos,
                       taintedSinkInfos: taintedSinkInfos));
        }
コード例 #20
0
        internal static ValueContentAnalysisResult GetOrComputeResult(
            ControlFlowGraph cfg,
            ISymbol owningSymbol,
            WellKnownTypeProvider wellKnownTypeProvider,
            InterproceduralAnalysisConfiguration interproceduralAnalysisConfig,
            out CopyAnalysisResult copyAnalysisResultOpt,
            out PointsToAnalysisResult pointsToAnalysisResultOpt,
            bool pessimisticAnalysis     = true,
            bool performPointsToAnalysis = true,
            bool performCopyAnalysis     = true,
            InterproceduralAnalysisPredicate interproceduralAnalysisPredicateOpt = null)
        {
            copyAnalysisResultOpt     = null;
            pointsToAnalysisResultOpt = performPointsToAnalysis ?
                                        PointsToAnalysis.PointsToAnalysis.GetOrComputeResult(cfg, owningSymbol, wellKnownTypeProvider, out copyAnalysisResultOpt,
                                                                                             interproceduralAnalysisConfig, interproceduralAnalysisPredicateOpt, pessimisticAnalysis, performCopyAnalysis) :
                                        null;
            var analysisContext = ValueContentAnalysisContext.Create(
                ValueContentAbstractValueDomain.Default, wellKnownTypeProvider, cfg, owningSymbol,
                interproceduralAnalysisConfig, pessimisticAnalysis, copyAnalysisResultOpt,
                pointsToAnalysisResultOpt, GetOrComputeResultForAnalysisContext, interproceduralAnalysisPredicateOpt);

            return(GetOrComputeResultForAnalysisContext(analysisContext));
        }
コード例 #21
0
        private static TaintedDataAnalysisResult TryGetOrComputeResult(
            ControlFlowGraph cfg,
            Compilation compilation,
            ISymbol containingMethod,
            AnalyzerOptions analyzerOptions,
            TaintedDataSymbolMap <SourceInfo> taintedSourceInfos,
            TaintedDataSymbolMap <SanitizerInfo> taintedSanitizerInfos,
            TaintedDataSymbolMap <SinkInfo> taintedSinkInfos,
            InterproceduralAnalysisConfiguration interproceduralAnalysisConfig)
        {
            if (cfg == null)
            {
                Debug.Fail("Expected non-null CFG");
                return(null);
            }

            WellKnownTypeProvider      wellKnownTypeProvider      = WellKnownTypeProvider.GetOrCreate(compilation);
            ValueContentAnalysisResult valueContentAnalysisResult = null;
            CopyAnalysisResult         copyAnalysisResult         = null;
            PointsToAnalysisResult     pointsToAnalysisResult     = null;

            if (taintedSourceInfos.RequiresValueContentAnalysis || taintedSanitizerInfos.RequiresValueContentAnalysis || taintedSinkInfos.RequiresValueContentAnalysis)
            {
                valueContentAnalysisResult = ValueContentAnalysis.TryGetOrComputeResult(
                    cfg,
                    containingMethod,
                    analyzerOptions,
                    wellKnownTypeProvider,
                    interproceduralAnalysisConfig,
                    out copyAnalysisResult,
                    out pointsToAnalysisResult,
                    pessimisticAnalysis: true,
                    performCopyAnalysis: false);
                if (valueContentAnalysisResult == null)
                {
                    return(null);
                }
            }
            else
            {
                pointsToAnalysisResult = PointsToAnalysis.TryGetOrComputeResult(
                    cfg,
                    containingMethod,
                    analyzerOptions,
                    wellKnownTypeProvider,
                    interproceduralAnalysisConfig,
                    interproceduralAnalysisPredicateOpt: null,
                    pessimisticAnalysis: true,
                    performCopyAnalysis: false);
                if (pointsToAnalysisResult == null)
                {
                    return(null);
                }
            }

            TaintedDataAnalysisContext analysisContext = TaintedDataAnalysisContext.Create(
                TaintedDataAbstractValueDomain.Default,
                wellKnownTypeProvider,
                cfg,
                containingMethod,
                analyzerOptions,
                interproceduralAnalysisConfig,
                pessimisticAnalysis: false,
                copyAnalysisResultOpt: copyAnalysisResult,
                pointsToAnalysisResult: pointsToAnalysisResult,
                valueContentAnalysisResult: valueContentAnalysisResult,
                tryGetOrComputeAnalysisResult: TryGetOrComputeResultForAnalysisContext,
                taintedSourceInfos: taintedSourceInfos,
                taintedSanitizerInfos: taintedSanitizerInfos,
                taintedSinkInfos: taintedSinkInfos);

            return(TryGetOrComputeResultForAnalysisContext(analysisContext));
        }