From 4a752f66b7ac083b26795934068224aac811c7c7 Mon Sep 17 00:00:00 2001 From: YoshiRulz Date: Wed, 3 May 2023 04:28:56 +1000 Subject: [PATCH] Add Analyzer to require checking or discarding `TryGetValue` I'm pretty sure all the existing instances were intended to use `default(T)` if the key isn't present, except maybe the cheatcode converters but I don't care to rewrite those at the moment --- Common.ruleset | 3 + .../AnalyzersCommon/RoslynUtils.cs | 12 ++++ .../TryGetValueImplicitDiscardAnalyzer.cs | 56 ++++++++++++++++++ References/BizHawk.Analyzer.dll | Bin 29696 -> 30720 bytes src/BizHawk.Bizware.BizwareGL/Pipeline.cs | 2 +- .../DirectInputAdapter.cs | 4 +- .../DisplayManager/FilterManager.cs | 2 +- src/BizHawk.Client.Common/RomLoader.cs | 2 +- .../cheats/GbGgGameGenieDecoder.cs | 16 ++--- .../cheats/GenesisGameGenieDecoder.cs | 2 +- .../cheats/NesGameGenieDecoder.cs | 28 ++++----- .../cheats/SnesGameGenieDecoder.cs | 16 ++--- .../config/ConfigExtensions.cs | 4 +- src/BizHawk.Client.EmuHawk/MainForm.cs | 4 +- .../config/ControllerConfig.cs | 2 +- .../Database/Database.cs | 2 +- .../Nintendo/SNES/LibsnesApi_QUERY.cs | 2 +- src/BizHawk.Emulation.Cores/CoreInventory.cs | 2 +- .../Waterbox/NymaCore.Settings.cs | 14 ++--- 19 files changed, 122 insertions(+), 51 deletions(-) create mode 100644 ExternalProjects/BizHawk.Analyzer/TryGetValueImplicitDiscardAnalyzer.cs diff --git a/Common.ruleset b/Common.ruleset index 57248b3d98..cc498e204c 100644 --- a/Common.ruleset +++ b/Common.ruleset @@ -31,6 +31,9 @@ + + + diff --git a/ExternalProjects/AnalyzersCommon/RoslynUtils.cs b/ExternalProjects/AnalyzersCommon/RoslynUtils.cs index 7c7dea0b7b..cc8b60d094 100644 --- a/ExternalProjects/AnalyzersCommon/RoslynUtils.cs +++ b/ExternalProjects/AnalyzersCommon/RoslynUtils.cs @@ -26,4 +26,16 @@ public static class RoslynUtils public static bool Matches(this ISymbol expected, ISymbol? actual) => SymbolEqualityComparer.Default.Equals(expected, actual); + +#if false // easier to just `.OriginalDefinition` always + public static bool Matches(this INamedTypeSymbol expected, INamedTypeSymbol? actual, bool degenericise) + { + if (degenericise) + { + if (expected.IsGenericType && !expected.IsUnboundGenericType) return expected.OriginalDefinition.Matches(actual, degenericise: true); + if (actual is not null && actual.IsGenericType && !actual.IsUnboundGenericType) return expected.Matches(actual.OriginalDefinition, degenericise: true); + } + return expected.Matches(actual as ISymbol); + } +#endif } diff --git a/ExternalProjects/BizHawk.Analyzer/TryGetValueImplicitDiscardAnalyzer.cs b/ExternalProjects/BizHawk.Analyzer/TryGetValueImplicitDiscardAnalyzer.cs new file mode 100644 index 0000000000..8f1ab1dc64 --- /dev/null +++ b/ExternalProjects/BizHawk.Analyzer/TryGetValueImplicitDiscardAnalyzer.cs @@ -0,0 +1,56 @@ +namespace BizHawk.Analyzers; + +using System.Collections.Immutable; +using System.Linq; + +using Microsoft.CodeAnalysis; +using Microsoft.CodeAnalysis.CSharp; +using Microsoft.CodeAnalysis.Diagnostics; +using Microsoft.CodeAnalysis.Operations; + +[DiagnosticAnalyzer(LanguageNames.CSharp)] +public sealed class TryGetValueImplicitDiscardAnalyzer : DiagnosticAnalyzer +{ + private static readonly DiagnosticDescriptor DiagUncheckedTryGetValue = new( + id: "BHI1200", + title: "Check result of IDictionary.TryGetValue, or discard it if default(T) is desired", + messageFormat: "Assign the result of this TryGetValue call to a variable or discard", + category: "Usage", + defaultSeverity: DiagnosticSeverity.Error, + isEnabledByDefault: true); + + public override ImmutableArray SupportedDiagnostics { get; } = ImmutableArray.Create(DiagUncheckedTryGetValue); + + public override void Initialize(AnalysisContext context) + { + context.ConfigureGeneratedCodeAnalysis(GeneratedCodeAnalysisFlags.None); + context.EnableConcurrentExecution(); + context.RegisterCompilationStartAction(static initContext => + { + const string STR_TGV = "TryGetValue"; + var rwDictSym = initContext.Compilation.GetTypeByMetadataName("System.Collections.Generic.IDictionary`2")!; + var roDictSym = initContext.Compilation.GetTypeByMetadataName("System.Collections.Generic.IReadOnlyDictionary`2")!; + bool IsBCLTryGetValue(IMethodSymbol calledSym) + => calledSym.ContainingType.AllInterfaces.Any(intfSym => + { + var degenericisedSym = intfSym.OriginalDefinition; + return rwDictSym.Matches(degenericisedSym) || roDictSym.Matches(degenericisedSym); + }); + initContext.RegisterOperationAction( + oac => + { + var operation = (IInvocationOperation) oac.Operation; + if (operation.Parent?.Kind is not OperationKind.ExpressionStatement) return; + var calledSym = operation.TargetMethod.ConstructedFrom; + if (calledSym.Name is STR_TGV) oac.ReportDiagnostic(Diagnostic.Create( + DiagUncheckedTryGetValue, + operation.Syntax.GetLocation(), + IsBCLTryGetValue(calledSym) ? DiagnosticSeverity.Error : DiagnosticSeverity.Warning, + additionalLocations: null, + properties: null, + messageArgs: null)); + }, + OperationKind.Invocation); + }); + } +} diff --git a/References/BizHawk.Analyzer.dll b/References/BizHawk.Analyzer.dll index 08bbf5e52134593215b51774f3b7b212426aa602..62e21f6ee46d175d0f5350b23c2cc2b075d14a43 100644 GIT binary patch literal 30720 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 diff --git a/src/BizHawk.Client.Common/cheats/GbGgGameGenieDecoder.cs b/src/BizHawk.Client.Common/cheats/GbGgGameGenieDecoder.cs index 3207d2c44f..96573dd702 100644 --- a/src/BizHawk.Client.Common/cheats/GbGgGameGenieDecoder.cs +++ b/src/BizHawk.Client.Common/cheats/GbGgGameGenieDecoder.cs @@ -52,20 +52,20 @@ namespace BizHawk.Client.Common.cheats // Getting Value if (_code.Length > 0) { - _gbGgGameGenieTable.TryGetValue(_code[0], out x); + _ = _gbGgGameGenieTable.TryGetValue(_code[0], out x); result.Value = x << 4; } if (_code.Length > 1) { - _gbGgGameGenieTable.TryGetValue(_code[1], out x); + _ = _gbGgGameGenieTable.TryGetValue(_code[1], out x); result.Value |= x; } // Address if (_code.Length > 2) { - _gbGgGameGenieTable.TryGetValue(_code[2], out x); + _ = _gbGgGameGenieTable.TryGetValue(_code[2], out x); result.Value = x << 8; } else @@ -75,30 +75,30 @@ namespace BizHawk.Client.Common.cheats if (_code.Length > 3) { - _gbGgGameGenieTable.TryGetValue(_code[3], out x); + _ = _gbGgGameGenieTable.TryGetValue(_code[3], out x); result.Address |= x << 4; } if (_code.Length > 4) { - _gbGgGameGenieTable.TryGetValue(_code[4], out x); + _ = _gbGgGameGenieTable.TryGetValue(_code[4], out x); result.Address |= x; } if (_code.Length > 5) { - _gbGgGameGenieTable.TryGetValue(_code[5], out x); + _ = _gbGgGameGenieTable.TryGetValue(_code[5], out x); result.Address |= (x ^ 0xF) << 12; } // compare need to be full if (_code.Length > 8) { - _gbGgGameGenieTable.TryGetValue(_code[6], out x); + _ = _gbGgGameGenieTable.TryGetValue(_code[6], out x); var comp = x << 2; // 8th character ignored - _gbGgGameGenieTable.TryGetValue(_code[8], out x); + _ = _gbGgGameGenieTable.TryGetValue(_code[8], out x); comp |= (x & 0xC) >> 2; comp |= (x & 0x3) << 6; result.Compare = comp ^ 0xBA; diff --git a/src/BizHawk.Client.Common/cheats/GenesisGameGenieDecoder.cs b/src/BizHawk.Client.Common/cheats/GenesisGameGenieDecoder.cs index 3968b7f03a..a198330f63 100644 --- a/src/BizHawk.Client.Common/cheats/GenesisGameGenieDecoder.cs +++ b/src/BizHawk.Client.Common/cheats/GenesisGameGenieDecoder.cs @@ -65,7 +65,7 @@ namespace BizHawk.Client.Common.cheats foreach (var t in code) { hexCode <<= 5; - GameGenieTable.TryGetValue(t, out var y); + _ = GameGenieTable.TryGetValue(t, out var y); hexCode |= y; } diff --git a/src/BizHawk.Client.Common/cheats/NesGameGenieDecoder.cs b/src/BizHawk.Client.Common/cheats/NesGameGenieDecoder.cs index 04cddfa884..1f5a25bb4b 100644 --- a/src/BizHawk.Client.Common/cheats/NesGameGenieDecoder.cs +++ b/src/BizHawk.Client.Common/cheats/NesGameGenieDecoder.cs @@ -47,26 +47,26 @@ namespace BizHawk.Client.Common.cheats result.Value = 0; result.Address = 0x8000; - GameGenieTable.TryGetValue(code[0], out var x); + _ = GameGenieTable.TryGetValue(code[0], out var x); result.Value |= x & 0x07; result.Value |= (x & 0x08) << 4; - GameGenieTable.TryGetValue(code[1], out x); + _ = GameGenieTable.TryGetValue(code[1], out x); result.Value |= (x & 0x07) << 4; result.Address |= (x & 0x08) << 4; - GameGenieTable.TryGetValue(code[2], out x); + _ = GameGenieTable.TryGetValue(code[2], out x); result.Address |= (x & 0x07) << 4; - GameGenieTable.TryGetValue(code[3], out x); + _ = GameGenieTable.TryGetValue(code[3], out x); result.Address |= (x & 0x07) << 12; result.Address |= x & 0x08; - GameGenieTable.TryGetValue(code[4], out x); + _ = GameGenieTable.TryGetValue(code[4], out x); result.Address |= x & 0x07; result.Address |= (x & 0x08) << 8; - GameGenieTable.TryGetValue(code[5], out x); + _ = GameGenieTable.TryGetValue(code[5], out x); result.Address |= (x & 0x07) << 8; result.Value |= x & 0x08; } @@ -79,34 +79,34 @@ namespace BizHawk.Client.Common.cheats result.Address = 0x8000; result.Compare = 0; - GameGenieTable.TryGetValue(code[0], out var x); + _ = GameGenieTable.TryGetValue(code[0], out var x); result.Value |= x & 0x07; result.Value |= (x & 0x08) << 4; - GameGenieTable.TryGetValue(code[1], out x); + _ = GameGenieTable.TryGetValue(code[1], out x); result.Value |= (x & 0x07) << 4; result.Address |= (x & 0x08) << 4; - GameGenieTable.TryGetValue(code[2], out x); + _ = GameGenieTable.TryGetValue(code[2], out x); result.Address |= (x & 0x07) << 4; - GameGenieTable.TryGetValue(code[3], out x); + _ = GameGenieTable.TryGetValue(code[3], out x); result.Address |= (x & 0x07) << 12; result.Address |= x & 0x08; - GameGenieTable.TryGetValue(code[4], out x); + _ = GameGenieTable.TryGetValue(code[4], out x); result.Address |= x & 0x07; result.Address |= (x & 0x08) << 8; - GameGenieTable.TryGetValue(code[5], out x); + _ = GameGenieTable.TryGetValue(code[5], out x); result.Address |= (x & 0x07) << 8; result.Compare |= x & 0x08; - GameGenieTable.TryGetValue(code[6], out x); + _ = GameGenieTable.TryGetValue(code[6], out x); result.Compare |= x & 0x07; result.Compare |= (x & 0x08) << 4; - GameGenieTable.TryGetValue(code[7], out x); + _ = GameGenieTable.TryGetValue(code[7], out x); result.Compare |= (x & 0x07) << 4; result.Value |= x & 0x08; } diff --git a/src/BizHawk.Client.Common/cheats/SnesGameGenieDecoder.cs b/src/BizHawk.Client.Common/cheats/SnesGameGenieDecoder.cs index e3829eb69f..24e12e8e80 100644 --- a/src/BizHawk.Client.Common/cheats/SnesGameGenieDecoder.cs +++ b/src/BizHawk.Client.Common/cheats/SnesGameGenieDecoder.cs @@ -55,53 +55,53 @@ namespace BizHawk.Client.Common.cheats // Value if (code.Length > 0) { - SNESGameGenieTable.TryGetValue(code[0], out x); + _ = SNESGameGenieTable.TryGetValue(code[0], out x); result.Value = x << 4; } if (code.Length > 1) { - SNESGameGenieTable.TryGetValue(code[1], out x); + _ = SNESGameGenieTable.TryGetValue(code[1], out x); result.Value |= x; } // Address if (code.Length > 2) { - SNESGameGenieTable.TryGetValue(code[2], out x); + _ = SNESGameGenieTable.TryGetValue(code[2], out x); result.Address = x << 12; } if (code.Length > 3) { - SNESGameGenieTable.TryGetValue(code[3], out x); + _ = SNESGameGenieTable.TryGetValue(code[3], out x); result.Address |= x << 4; } if (code.Length > 4) { - SNESGameGenieTable.TryGetValue(code[4], out x); + _ = SNESGameGenieTable.TryGetValue(code[4], out x); result.Address |= (x & 0xC) << 6; result.Address |= (x & 0x3) << 22; } if (code.Length > 5) { - SNESGameGenieTable.TryGetValue(code[5], out x); + _ = SNESGameGenieTable.TryGetValue(code[5], out x); result.Address |= (x & 0xC) << 18; result.Address |= (x & 0x3) << 2; } if (code.Length > 6) { - SNESGameGenieTable.TryGetValue(code[6], out x); + _ = SNESGameGenieTable.TryGetValue(code[6], out x); result.Address |= (x & 0xC) >> 2; result.Address |= (x & 0x3) << 18; } if (code.Length > 7) { - SNESGameGenieTable.TryGetValue(code[7], out x); + _ = SNESGameGenieTable.TryGetValue(code[7], out x); result.Address |= (x & 0xC) << 14; result.Address |= (x & 0x3) << 10; } diff --git a/src/BizHawk.Client.Common/config/ConfigExtensions.cs b/src/BizHawk.Client.Common/config/ConfigExtensions.cs index 796b7a295c..db982d0d3a 100644 --- a/src/BizHawk.Client.Common/config/ConfigExtensions.cs +++ b/src/BizHawk.Client.Common/config/ConfigExtensions.cs @@ -45,7 +45,7 @@ namespace BizHawk.Client.Common /// null if no settings were saved, or there was an error deserializing public static object GetCoreSettings(this Config config, Type coreType, Type settingsType) { - config.CoreSettings.TryGetValue(coreType.ToString(), out var j); + _ = config.CoreSettings.TryGetValue(coreType.ToString(), out var j); return Deserialize(j, settingsType); } @@ -85,7 +85,7 @@ namespace BizHawk.Client.Common /// null if no settings were saved, or there was an error deserializing public static object GetCoreSyncSettings(this Config config, Type coreType, Type syncSettingsType) { - config.CoreSyncSettings.TryGetValue(coreType.ToString(), out var j); + _ = config.CoreSyncSettings.TryGetValue(coreType.ToString(), out var j); return Deserialize(j, syncSettingsType); } diff --git a/src/BizHawk.Client.EmuHawk/MainForm.cs b/src/BizHawk.Client.EmuHawk/MainForm.cs index 6ea67c3e4c..0f9fb07a11 100644 --- a/src/BizHawk.Client.EmuHawk/MainForm.cs +++ b/src/BizHawk.Client.EmuHawk/MainForm.cs @@ -81,9 +81,9 @@ namespace BizHawk.Client.EmuHawk entry.Click += ClickHandler; return (ToolStripItem) entry; }).ToArray()); - submenu.DropDownOpened += (openedSender, _) => + submenu.DropDownOpened += (openedSender, _1) => { - Config.PreferredCores.TryGetValue(groupLabel, out var preferred); + _ = Config.PreferredCores.TryGetValue(groupLabel, out var preferred); foreach (ToolStripMenuItem entry in ((ToolStripMenuItem) openedSender).DropDownItems) entry.Checked = entry.Text == preferred; }; CoresSubMenu.DropDownItems.Add(submenu); diff --git a/src/BizHawk.Client.EmuHawk/config/ControllerConfig.cs b/src/BizHawk.Client.EmuHawk/config/ControllerConfig.cs index 03df2722c1..3f64cda681 100644 --- a/src/BizHawk.Client.EmuHawk/config/ControllerConfig.cs +++ b/src/BizHawk.Client.EmuHawk/config/ControllerConfig.cs @@ -267,7 +267,7 @@ namespace BizHawk.Client.EmuHawk private void SetControllerPicture(string controlName) { - ControllerImages.TryGetValue(controlName, out var lazyBmp); + _ = ControllerImages.TryGetValue(controlName, out var lazyBmp); if (lazyBmp != null) { var bmp = lazyBmp.Value; diff --git a/src/BizHawk.Emulation.Common/Database/Database.cs b/src/BizHawk.Emulation.Common/Database/Database.cs index bf670ee524..5dbe97029c 100644 --- a/src/BizHawk.Emulation.Common/Database/Database.cs +++ b/src/BizHawk.Emulation.Common/Database/Database.cs @@ -194,7 +194,7 @@ namespace BizHawk.Emulation.Common _acquire.WaitOne(); var hashFormatted = FormatHash(hash); - DB.TryGetValue(hashFormatted, out var cgi); + _ = DB.TryGetValue(hashFormatted, out var cgi); if (cgi == null) { Console.WriteLine($"DB: hash {hash} not in game database."); diff --git a/src/BizHawk.Emulation.Cores/Consoles/Nintendo/SNES/LibsnesApi_QUERY.cs b/src/BizHawk.Emulation.Cores/Consoles/Nintendo/SNES/LibsnesApi_QUERY.cs index fc4c242c6f..9bc56c84b3 100644 --- a/src/BizHawk.Emulation.Cores/Consoles/Nintendo/SNES/LibsnesApi_QUERY.cs +++ b/src/BizHawk.Emulation.Cores/Consoles/Nintendo/SNES/LibsnesApi_QUERY.cs @@ -29,7 +29,7 @@ namespace BizHawk.Emulation.Cores.Nintendo.SNES public byte* QUERY_get_memory_data(SNES_MEMORY id) { string name = QUERY_MemoryNameForId(id); - _sharedMemoryBlocks.TryGetValue(name, out var ret); + _ = _sharedMemoryBlocks.TryGetValue(name, out var ret); return (byte*)ret; } diff --git a/src/BizHawk.Emulation.Cores/CoreInventory.cs b/src/BizHawk.Emulation.Cores/CoreInventory.cs index 5edcde5fd8..6573150a4d 100644 --- a/src/BizHawk.Emulation.Cores/CoreInventory.cs +++ b/src/BizHawk.Emulation.Cores/CoreInventory.cs @@ -151,7 +151,7 @@ namespace BizHawk.Emulation.Cores public IEnumerable GetCores(string system) { - _systems.TryGetValue(system, out var cores); + _ = _systems.TryGetValue(system, out var cores); return cores ?? Enumerable.Empty(); } diff --git a/src/BizHawk.Emulation.Cores/Waterbox/NymaCore.Settings.cs b/src/BizHawk.Emulation.Cores/Waterbox/NymaCore.Settings.cs index 05663da7bb..44297aa50e 100644 --- a/src/BizHawk.Emulation.Cores/Waterbox/NymaCore.Settings.cs +++ b/src/BizHawk.Emulation.Cores/Waterbox/NymaCore.Settings.cs @@ -113,8 +113,8 @@ namespace BizHawk.Emulation.Cores.Waterbox var possible = info.AllOverrides.Where(kvp => kvp.Value.NonSync && kvp.Value.NoRestart).Select(kvp => kvp.Key); return possible.Where(key => { - x.MednafenValues.TryGetValue(key, out var xx); - y.MednafenValues.TryGetValue(key, out var yy); + _ = x.MednafenValues.TryGetValue(key, out var xx); + _ = y.MednafenValues.TryGetValue(key, out var yy); return xx != yy; }); } @@ -124,8 +124,8 @@ namespace BizHawk.Emulation.Cores.Waterbox var restarters = info.AllOverrides.Where(kvp => kvp.Value.NonSync && !kvp.Value.NoRestart).Select(kvp => kvp.Key); foreach (var key in restarters) { - x.MednafenValues.TryGetValue(key, out var xx); - y.MednafenValues.TryGetValue(key, out var yy); + _ = x.MednafenValues.TryGetValue(key, out var xx); + _ = y.MednafenValues.TryGetValue(key, out var yy); if (xx != yy) return PutSettingsDirtyBits.RebootCore; } @@ -186,8 +186,8 @@ namespace BizHawk.Emulation.Cores.Waterbox var restarters = info.AllOverrides.Where(kvp => !kvp.Value.NonSync && !kvp.Value.NoRestart).Select(kvp => kvp.Key); foreach (var key in restarters) { - x.MednafenValues.TryGetValue(key, out var xx); - y.MednafenValues.TryGetValue(key, out var yy); + _ = x.MednafenValues.TryGetValue(key, out var xx); + _ = y.MednafenValues.TryGetValue(key, out var yy); if (xx != yy) return PutSettingsDirtyBits.RebootCore; } @@ -206,7 +206,7 @@ namespace BizHawk.Emulation.Cores.Waterbox { // try to get actual value from settings var dict = ovr.NonSync ? _settings.MednafenValues : _syncSettingsActual.MednafenValues; - dict.TryGetValue(name, out val); + _ = dict.TryGetValue(name, out val); } if (val == null) {