Fix MA0185 false-positive for nullable value types#995
Conversation
Co-authored-by: meziantou <509220+meziantou@users.noreply.github.com>
Co-authored-by: meziantou <509220+meziantou@users.noreply.github.com>
|
@copilot Test fails [xUnit.net 00:01:30.36] Meziantou.Analyzer.Test.Rules.UseIFormatProviderAnalyzerTests.NullableInt32ToStringWithoutCultureInfo_DisabledConfig [FAIL] Diagnostics: Source: Stack Trace: Error: Mismatch between number of diagnostics returned, expected "0" actual "1" |
…rmattableType Co-authored-by: meziantou <509220+meziantou@users.noreply.github.com>
Fixed in e2c59fe. The issue was that I modified Warning Firewall rules blocked me from connecting to one or more addresses (expand for details)I tried to connect to the following addresses, but was blocked by firewall rules:
If you need me to access, download, or install something from one of these locations, you can either:
|
Updated [Meziantou.Analyzer](https://github.com/meziantou/Meziantou.Analyzer) from 2.0.285 to 2.0.297. <details> <summary>Release notes</summary> _Sourced from [Meziantou.Analyzer's releases](https://github.com/meziantou/Meziantou.Analyzer/releases)._ ## 2.0.297 NuGet package: <https://www.nuget.org/packages/Meziantou.Analyzer/2.0.297> ## What's Changed * MA0007: Support multiline pattern-matching expressions by @Copilot in meziantou/Meziantou.Analyzer#997 **Full Changelog**: meziantou/Meziantou.Analyzer@2.0.296...2.0.297 ## 2.0.296 NuGet package: <https://www.nuget.org/packages/Meziantou.Analyzer/2.0.296> ## What's Changed * Fix MA0185 false-positive for nullable value types by @Copilot in meziantou/Meziantou.Analyzer#995 **Full Changelog**: meziantou/Meziantou.Analyzer@2.0.295...2.0.296 ## 2.0.295 NuGet package: <https://www.nuget.org/packages/Meziantou.Analyzer/2.0.295> ## What's Changed * Update default TargetFramework and adjust test setups by @meziantou in meziantou/Meziantou.Analyzer#993 **Full Changelog**: meziantou/Meziantou.Analyzer@2.0.294...2.0.295 ## 2.0.294 NuGet package: <https://www.nuget.org/packages/Meziantou.Analyzer/2.0.294> **Full Changelog**: meziantou/Meziantou.Analyzer@2.0.293...2.0.294 ## 2.0.293 NuGet package: <https://www.nuget.org/packages/Meziantou.Analyzer/2.0.293> ## What's Changed * Fix MA0183 false-positive with params array arguments in string.Format by @Copilot in meziantou/Meziantou.Analyzer#991 **Full Changelog**: meziantou/Meziantou.Analyzer@2.0.292...2.0.293 ## 2.0.292 NuGet package: <https://www.nuget.org/packages/Meziantou.Analyzer/2.0.292> ## What's Changed * Enable MA0184 by default with silent severity by @Copilot in meziantou/Meziantou.Analyzer#988 **Full Changelog**: meziantou/Meziantou.Analyzer@2.0.291...2.0.292 ## 2.0.291 NuGet package: <https://www.nuget.org/packages/Meziantou.Analyzer/2.0.291> ## What's Changed * MA0185: Add tests and docs for literal-only interpolated strings by @Copilot in meziantou/Meziantou.Analyzer#987 **Full Changelog**: meziantou/Meziantou.Analyzer@2.0.290...2.0.291 ## 2.0.290 NuGet package: <https://www.nuget.org/packages/Meziantou.Analyzer/2.0.290> ## What's Changed * Add MA0185: Simplify string.Create with culture-invariant parameters by @Copilot in meziantou/Meziantou.Analyzer#986 **Full Changelog**: meziantou/Meziantou.Analyzer@2.0.289...2.0.290 ## 2.0.289 NuGet package: <https://www.nuget.org/packages/Meziantou.Analyzer/2.0.289> ## What's Changed * Add MA0184: Report interpolated strings without parameters by @Copilot in meziantou/Meziantou.Analyzer#984 **Full Changelog**: meziantou/Meziantou.Analyzer@2.0.288...2.0.289 ## 2.0.288 NuGet package: <https://www.nuget.org/packages/Meziantou.Analyzer/2.0.288> ## What's Changed * Disable MA0042 async overload suggestions for TemporaryDirectory in test projects by @Copilot in meziantou/Meziantou.Analyzer#980 **Full Changelog**: meziantou/Meziantou.Analyzer@2.0.287...2.0.288 ## 2.0.287 NuGet package: <https://www.nuget.org/packages/Meziantou.Analyzer/2.0.287> ## What's Changed * Add MA0183: Detect string.Format without placeholders or formatting arguments by @Copilot in meziantou/Meziantou.Analyzer#979 **Full Changelog**: meziantou/Meziantou.Analyzer@2.0.286...2.0.287 ## 2.0.286 NuGet package: <https://www.nuget.org/packages/Meziantou.Analyzer/2.0.286> **Full Changelog**: meziantou/Meziantou.Analyzer@2.0.285...2.0.286 Commits viewable in [compare view](meziantou/Meziantou.Analyzer@2.0.285...2.0.297). </details> [](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) --- <details> <summary>Dependabot commands and options</summary> <br /> You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot show <dependency name> ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself) </details> Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Fix MA0185 False-positive with
int?int?Root Cause
The MA0185 analyzer was using
CultureSensitiveOptions.Nonewhich doesn't unwrap nullable types. This causedint?to be checked asNullable<int>which doesn't implementIFormattable, leading to the false positive.Changes Made
SimplifyStringCreateWhenAllParametersAreCultureInvariantAnalyzerto useCultureSensitiveOptions.UnwrapNullableOfTinstead ofCultureSensitiveOptions.Noneint?are checked by their underlying type (int) which correctly identifies them as culture-sensitiveCultureSensitiveFormattingContext.IsFormattableType()which was breaking MA0011'sconsider_nullable_typesconfiguration optionStringCreateWithInvariantCulture_WithNullableInteger_NoDiagnostic- verifies fix forint?StringCreateWithInvariantCulture_WithNullableDouble_NoDiagnostic- verifies fix fordouble?Testing
NullableInt32ToStringWithoutCultureInfo_DisabledConfig)Why This Approach
The previous approach of always unwrapping in
IsFormattableTypebroke MA0011's behavior whenconsider_nullable_typesis false. The correct fix is to make MA0185 explicitly unwrap nullable types by using theUnwrapNullableOfToption, which respects the semantics of checking underlying types forstring.CreatewithInvariantCulture.Original prompt
int?#994💬 We'd love your input! Share your thoughts on Copilot coding agent in our 2 minute survey.