From fb5d76972949832109d9c92fe27bf6511729dfbc Mon Sep 17 00:00:00 2001 From: Manish Vasani Date: Thu, 20 Jul 2023 06:28:54 -0700 Subject: [PATCH] Fix race condition in CA1001 analyzer Fixes #6780 --- .../TypesThatOwnDisposableFieldsShouldBeDisposable.cs | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/NetAnalyzers/Core/Microsoft.CodeQuality.Analyzers/ApiDesignGuidelines/TypesThatOwnDisposableFieldsShouldBeDisposable.cs b/src/NetAnalyzers/Core/Microsoft.CodeQuality.Analyzers/ApiDesignGuidelines/TypesThatOwnDisposableFieldsShouldBeDisposable.cs index 8e5e0b19cd..44aa159335 100644 --- a/src/NetAnalyzers/Core/Microsoft.CodeQuality.Analyzers/ApiDesignGuidelines/TypesThatOwnDisposableFieldsShouldBeDisposable.cs +++ b/src/NetAnalyzers/Core/Microsoft.CodeQuality.Analyzers/ApiDesignGuidelines/TypesThatOwnDisposableFieldsShouldBeDisposable.cs @@ -1,5 +1,6 @@ // Copyright (c) Microsoft. All Rights Reserved. Licensed under the MIT license. See License.txt in the project root for license information. +using System.Collections.Concurrent; using System.Collections.Generic; using System.Collections.Immutable; using System.Linq; @@ -71,13 +72,13 @@ private static void AnalyzeSymbolStart(SymbolStartAnalysisContext ctx, DisposeAn return; } - var disposableFieldNamesBuilder = ArrayBuilder.GetInstance(); + var disposableFieldNamesBuilder = new ConcurrentBag(); ctx.RegisterOperationAction(context => AnalyzeOperation(context, namedType, disposableFields, disposableFieldNamesBuilder), OperationKind.SimpleAssignment, OperationKind.FieldInitializer); - ctx.RegisterSymbolEndAction(context => AnalyzeSymbolEnd(context, disposableFieldNamesBuilder.ToImmutableAndFree())); + ctx.RegisterSymbolEndAction(context => AnalyzeSymbolEnd(context, disposableFieldNamesBuilder.ToImmutableArray())); } - private static void AnalyzeOperation(OperationAnalysisContext ctx, INamedTypeSymbol parent, ISet disposableFields, ArrayBuilder disposableFieldNamesBuilder) + private static void AnalyzeOperation(OperationAnalysisContext ctx, INamedTypeSymbol parent, ISet disposableFields, ConcurrentBag disposableFieldNamesBuilder) { if (ctx.Operation is IAssignmentOperation { Target: IFieldReferenceOperation field } assignment && assignment.Value.WalkDownConversion().Kind == OperationKind.ObjectCreation