Skip to main content
ANcpLua.Analyzers enforces code quality and prevents common bugs. Included automatically with ANcpLua.NET.Sdk.
  • 106 diagnostics spanning design, reliability, performance, OpenTelemetry, ASP.NET Core, AOT, and version management.
  • 42 automatic code fixes for high-confidence transformations.
  • CI-friendly enforcement through .editorconfig severity configuration.

Categories

CategoryRulesExamples
Roslyn Utilities20Guard helpers, symbol comparison, collection extensions
OpenTelemetry23Semantic conventions, ActivitySource, attribute validation, OTLP
AOT Testing10AotTest/TrimTest return codes, AotSafe/AotUnsafe, dynamic, reflection
ASP.NET Core9Form binding, resilience, health checks, service discovery
Usage8Span comparisons, IXmlSerializable, static lambdas, banned APIs
VersionManagement6Hardcoded versions, Version.props, diagnostics alignment
Threading6Lock patterns, async void, blocking calls in async
Configuration5ServiceDefaults, endpoints, EventSource, connection strings
Design5Primary constructors, type partialness, closed hierarchies
Metrics5Meter registration, naming, high cardinality, source generation
GenAI4Required attributes, operation names, token histograms
Style3Pattern matching, null-guard normalization
Reliability2Division by zero, await using

Rules

IdCategoryDescriptionSeverityFix
AL0001DesignProhibit reassignment of primary constructor parametersError-
AL0002DesignDon’t repeat negated patternsWarningYes
AL0003ReliabilityDon’t divide by constant zeroError-
AL0004UsageUse pattern matching for Span constantsWarningYes
AL0005UsageUse SequenceEqual for Span non-constantsWarningYes
AL0006DesignField name conflicts with primary constructorWarning-
AL0007UsageGetSchema should be explicitly implementedError-
AL0008UsageGetSchema must return nullErrorYes
AL0009UsageDon’t call IXmlSerializable.GetSchemaError-
AL0010DesignType should be partialDisabledYes
AL0011ThreadingAvoid lock on non-Lock typesWarningYes
AL0012OpenTelemetryDeprecated semantic conventionWarningYes
AL0013OpenTelemetryMissing telemetry schema URLInfo-
AL0014StylePrefer pattern matching for null/zeroWarningYes
AL0015StyleNormalize null-guard styleInfoYes
AL0016StyleCombine declaration with null-checkInfoYes
AL0017VersionManagementHardcoded package versionWarning-
AL0018VersionManagementVersion.props not importedWarning-
AL0019VersionManagementUndefined version variableWarning-
AL0020ASP.NET CoreIFormCollection requires explicit attributeError-
AL0021ASP.NET CoreMultiple structured form sourcesError-
AL0022ASP.NET CoreMixed form collection and DTOError-
AL0023ASP.NET CoreUnsupported form typeError-
AL0024ASP.NET CoreForm and body conflictError-
AL0025UsageAnonymous function can be staticWarningYes
AL0026UsagePrefer TimeProvider over legacy date/time APIsWarningYes
AL0027UsagePrefer System.Text.Json over NewtonsoftWarningYes
AL0028Roslyn UtilitiesUse IsEqualTo() for symbol comparisonInfoYes
AL0029Roslyn UtilitiesUse HasAttribute() for attribute checksInfoYes
AL0030Roslyn UtilitiesUse type hierarchy extensionsInfoYes
AL0031Roslyn UtilitiesUse operation extensionsInfoYes
AL0032Roslyn UtilitiesUse OrEmpty() extensionInfoYes
AL0033Roslyn UtilitiesUse ToImmutableArrayOrEmpty() extensionInfoYes
AL0034Roslyn UtilitiesUse WhereNotNull() extensionInfoYes
AL0035Roslyn UtilitiesUse GetFullyQualifiedName/GetMetadataName()InfoYes
AL0036Roslyn UtilitiesUse Guard.NotNull()WarningYes
AL0037Roslyn UtilitiesUse TryParse extensionsWarningYes
AL0038Roslyn UtilitiesUse GetOrNull/GetOrDefault extensionsWarningYes
AL0039Roslyn UtilitiesUse StringComparison extensionsWarningYes
AL0040Roslyn UtilitiesUse attribute argument extensionsWarningYes
AL0041AOT Testing[AotTest]/[TrimTest] must return intError-
AL0042AOT Testing[AotTest]/[TrimTest] should return 100Warning-
AL0043AOT Testing[TrimSafe] violates trim safetyWarning-
AL0044AOT Testing[AotSafe] violates AOT safetyWarning-
AL0045Roslyn UtilitiesUse Guard.NotNullOrEmpty()WarningYes
AL0046Roslyn UtilitiesUse Guard.NotNullOrWhiteSpace()WarningYes
AL0047Roslyn UtilitiesUse Guard.NotZero()WarningYes
AL0048Roslyn UtilitiesUse Guard.NotNegative()WarningYes
AL0049Roslyn UtilitiesUse Guard.Positive()WarningYes
AL0050Roslyn UtilitiesUse Guard.NotEmptyGuid()WarningYes
AL0051Roslyn UtilitiesUse Guard.DefinedEnum()WarningYes
AL0052AOT Testing[AotSafe] must not call [AotUnsafe]Error-
AL0053AOT TestingUnnecessary [AotUnsafe] attributeWarning-
AL0054VersionManagementDiagnostic missing from documentationWarning-
AL0055VersionManagementDiagnostic missing from release notesWarning-
AL0056VersionManagementDiagnostic documentation mismatchWarning-
AL0057ThreadingAvoid async void methodsWarning-
AL0058ThreadingAvoid lock on thisWarning-
AL0059ThreadingAvoid lock on typeof(T)Warning-
AL0060ThreadingAvoid lock on stringWarning-
AL0061OpenTelemetryActivity missing semconv attributesWarning-
AL0062OpenTelemetryDeprecated semantic conventionWarning-
AL0063OpenTelemetryUnregistered ActivitySourceWarning-
AL0064GenAIGenAI span missing required attributesWarning-
AL0065GenAIUse token usage histogramWarning-
AL0066GenAIInvalid GenAI operation nameWarning-
AL0067MetricsUnregistered MeterWarning-
AL0068MetricsInvalid metric nameWarning-
AL0069ConfigurationIncomplete ServiceDefaultsWarning-
AL0070ConfigurationNon-OTLP collector endpointWarning-
AL0071MetricsMeter class must be partial staticErrorYes
AL0072MetricsMetric method must be partialErrorYes
AL0073OpenTelemetry[Traced] requires non-empty ActivitySourceNameErrorYes
AL0074GenAIDeprecated GenAI attributeWarningYes
AL0075MetricsHigh-cardinality metric tagWarning-
AL0076OpenTelemetryMissing OTel configurationWarning-
AL0077OpenTelemetryDuplicate instrumentationWarning-
AL0078OpenTelemetryInvalid ActivitySource nameError-
AL0079OpenTelemetryManual span recommendedInfo-
AL0080ASP.NET CoreMissing resilience configurationWarning-
AL0081ASP.NET CoreMissing health checksWarning-
AL0082ConfigurationConsider connection string configurationInfo-
AL0083ConfigurationInsecure endpointWarning-
AL0084ASP.NET CoreMissing service discoveryWarning-
AL0085OpenTelemetryInvalid attribute valueError-
AL0086OpenTelemetryIncorrect attribute typeWarning-
AL0087OpenTelemetryPrefer constant attributeInfo-
AL0088OpenTelemetrySensitive data in attributeWarning-
AL0089OpenTelemetryMissing OTLP configurationWarning-
AL0090OpenTelemetryUncompressed OTLP exportWarning-
AL0091OpenTelemetryBatch export disabledWarning-
AL0092OpenTelemetryConsider samplingInfo-
AL0093OpenTelemetryMissing resource attributesWarning-
AL0094AOT TestingAvoid dynamic keywordWarning-
AL0095AOT TestingAvoid Expression.Compile()Warning-
AL0096ConfigurationEnable EventSource support for AOTWarning-
AL0101AOT TestingAvoid Activator.CreateInstanceWarning-
AL0102AOT TestingAvoid Type.GetTypeWarning-
AL0103DesignClosed type hierarchy switch exhaustivenessWarningYes
AL0104ReliabilityPrefer await using for IAsyncDisposableWarning-
AL0105ThreadingAvoid blocking calls in async methodsWarning-
AL0106ASP.NET CoreAvoid Task.Run in ASP.NET CoreWarning-
AL0107OpenTelemetryOrphaned [TracedTag] attributeWarningYes
AL0108OpenTelemetryRedundant [NoTrace] attributeInfoYes
AL0109OpenTelemetryNon-interceptable [Traced] methodWarningYes
AL0110OpenTelemetry[TracedTag] on out/ref parameterErrorYes
Legend: Error = build error, Warning = build warning, Info = IDE suggestion, Disabled = off by default.

Refactorings

IdDescription
AR0001Snake case to Pascal case
AR0002Make static lambda

Configuration

Configure via .editorconfig. See Configuration.
[*.cs]
dotnet_diagnostic.AL0014.severity = warning
dotnet_diagnostic.AL0010.severity = none