internal PropertySetAbstractValue ReplaceAt(int index, PropertySetAbstractValueKind kind) { Debug.Assert(index >= 0); int newLength; if (index >= this.KnownPropertyAbstractValues.Length) { newLength = index + 1; } else { newLength = this.KnownPropertyAbstractValues.Length; } ArrayBuilder <PropertySetAbstractValueKind> kinds = ArrayBuilder <PropertySetAbstractValueKind> .GetInstance(newLength); try { kinds.AddRange(this.KnownPropertyAbstractValues); while (kinds.Count < newLength) { kinds.Add(PropertySetAbstractValueKind.Unknown); } kinds[index] = kind; return(GetInstance(kinds)); } finally { kinds.Free(); } }
private static PropertySetAbstractValueKind MergeKind(PropertySetAbstractValueKind kind1, PropertySetAbstractValueKind kind2) { if (kind1 == kind2) { return(kind1); } else { return(PropertySetAbstractValueKind.MaybeFlagged); } }
public static PropertySetAbstractValue GetInstance(PropertySetAbstractValueKind v1, PropertySetAbstractValueKind v2) { return(Pool.GetInstance(v1, v2)); }
public PropertySetAbstractValue GetInstance(PropertySetAbstractValueKind v1, PropertySetAbstractValueKind v2) { return(this.TwoDimensionalPool[(int)v1, (int)v2]); }
public PropertySetAbstractValue GetInstance(PropertySetAbstractValueKind v1) { return(this.OneDimensionalPool[(int)v1]); }
public override void Initialize(AnalysisContext context) { if (!Debugger.IsAttached) // prefer single thread for debugging in development { context.EnableConcurrentExecution(); } if (context.IsAuditMode()) { context.ConfigureGeneratedCodeAnalysis(GeneratedCodeAnalysisFlags.Analyze | GeneratedCodeAnalysisFlags.ReportDiagnostics); } else { context.ConfigureGeneratedCodeAnalysis(GeneratedCodeAnalysisFlags.None); } if (!Debugger.IsAttached) // prefer single thread for debugging in development { context.EnableConcurrentExecution(); } if (context.IsAuditMode()) { context.ConfigureGeneratedCodeAnalysis(GeneratedCodeAnalysisFlags.Analyze | GeneratedCodeAnalysisFlags.ReportDiagnostics); } else { context.ConfigureGeneratedCodeAnalysis(GeneratedCodeAnalysisFlags.None); } context.RegisterCompilationStartAction( (CompilationStartAnalysisContext compilationContext) => { Compilation compilation = compilationContext.Compilation; var wellKnownTypeProvider = WellKnownTypeProvider.GetOrCreate(compilation); if (!wellKnownTypeProvider.TryGetOrCreateTypeByMetadataName("System.Xml.Xsl.XsltSettings", out var type)) { return; } var configuration = Configuration.GetOrCreate(compilationContext); compilationContext.RegisterOperationBlockStartAction( operationBlockStartContext => { ISymbol owningSymbol = operationBlockStartContext.OwningSymbol; AnalyzerOptions options = operationBlockStartContext.Options; CancellationToken cancellationToken = operationBlockStartContext.CancellationToken; if (options.IsConfiguredToSkipAnalysis(Rule, owningSymbol, compilation, cancellationToken)) { return; } bool?GetValue(IOperation operation, IOperation value, OperationAnalysisContext operationAnalysisContext) { if (value.ConstantValue.HasValue && value.ConstantValue.Value is bool isEnableScript) { return(isEnableScript); } if (!operation.TryGetEnclosingControlFlowGraph(out var cfg)) { return(null); } var valueContentResult = ValueContentAnalysis.TryGetOrComputeResult(cfg, owningSymbol, wellKnownTypeProvider, operationAnalysisContext.Options, Rule, PointsToAnalysisKind.Complete, operationAnalysisContext.CancellationToken); if (valueContentResult == null) { return(null); } ValueContentAbstractValue abstractValue = valueContentResult[value.Kind, value.Syntax]; PropertySetAbstractValueKind kind = PropertySetCallbacks.EvaluateLiteralValues(abstractValue, (object?o) => o is true); if (kind == PropertySetAbstractValueKind.MaybeFlagged || kind == PropertySetAbstractValueKind.Flagged) { return(true); } kind = PropertySetCallbacks.EvaluateLiteralValues(abstractValue, (object?o) => o is false); if (kind == PropertySetAbstractValueKind.Flagged) { return(false); } return(null); } operationBlockStartContext.RegisterOperationAction( ctx => { IAssignmentOperation operation = (IAssignmentOperation)ctx.Operation; if (!(operation.Target is IPropertyReferenceOperation propertyReferenceOperation)) { return; } if (propertyReferenceOperation.Member.ContainingType != type) { return; } if (propertyReferenceOperation.Member.Name == "EnableScript") { var enableScript = GetValue(operation, operation.Value, ctx); if ((enableScript.HasValue && enableScript.Value) || !enableScript.HasValue && configuration.AuditMode) { ctx.ReportDiagnostic(Diagnostic.Create(Rule, operation.Syntax.GetLocation())); } } }, OperationKind.SimpleAssignment); operationBlockStartContext.RegisterOperationAction( ctx => { var operation = (IPropertyReferenceOperation)ctx.Operation; if (operation.Property.ContainingType != type || operation.Property.Name != "TrustedXslt") { return; } ctx.ReportDiagnostic(Diagnostic.Create(Rule, operation.Syntax.GetLocation())); }, OperationKind.PropertyReference); operationBlockStartContext.RegisterOperationAction( ctx => { IObjectCreationOperation invocationOperation = (IObjectCreationOperation)ctx.Operation; if (invocationOperation.Constructor.ContainingType != type) { return; } var enableScriptArg = invocationOperation.Arguments.FirstOrDefault(x => x.Parameter.Name == "enableScript"); if (enableScriptArg == null) { return; } var enableScript = GetValue(invocationOperation, enableScriptArg.Value, ctx); if ((enableScript.HasValue && enableScript.Value) || !enableScript.HasValue && configuration.AuditMode) { ctx.ReportDiagnostic(Diagnostic.Create(Rule, invocationOperation.Syntax.GetLocation())); } }, OperationKind.ObjectCreation); }); }); }