Gaurav Deshmukh Gaurav Deshmukh - 6 days ago 4
C# Question

FxCop: Suppression message for async method

I am using FxCopCmd tool for static code analysis. Since we already had a huge codebase, we baselined existing issues using baseline.exe tool that comes with FxCop.

I am observing that if I add a new method to my C# class, then some of the suppression messages in GlobalSuppression.cs file stop working and I get issues for the code I haven't touched.

Example:

namespace ConsoleApplication1
{
class Program
{
public async Task<string> method1()
{
string a = "";
a.Equals("abc", StringComparison.InvariantCultureIgnoreCase);
return a;
}

static void Main(string[] args)
{

}
}
}


This throws following error:


CA1031 : Microsoft.Design : Modify 'Program.d__0.MoveNext()'
to catch a more specific exception than 'Exception' or rethrow the
exception


To suppress the 'CA1309 UseOrdinalStringComparison' issue, I added following suppression message in GlobalSuppression.cs file


[module: SuppressMessage("Microsoft.Globalization", "CA1309:UseOrdinalStringComparison", Scope="member",
Target="ConsoleApplication1.Program.d__0.MoveNext()",
MessageId="System.String.Equals(System.String,System.StringComparison)",
Justification="")]


But if I add one more method in the class, then this suppression message stops working. This is because method1 is async and so a new class is created (refer this) in compiled code (which was
<method1>d__0
in the first case). But when I add another method before method1, then the new class created in compiled code is named
<method1>d__1
. Consequently, the suppression message is not applied and FxCop again starts showing errors in the code.

Is there any way to suppress FxCop errors for async methods permanently?

Answer

So even after setting bounty, the question went unanswered. However, I found the workaround (if not the solution).

The mentioned problem is due to compiler generated code for async methods. Since FxCopCmd runs on dll, as compiler generated code is changed, the existing suppression messages get useless. However, Visual Studio doesn't run code analysis by merely using FxCopCmd. It runs code analysis intelligently ignoring async methods. (As per my investigation, it doesn't run any kind of code analysis on async methods. It must be due to the problem in question.)

To get the same behavior as Visual Studio in CI builds, we can use fxcoptask.dll for running FxCop analysis on code. Refer to this answer to know how to integrate FxCop in the build. This will solve the issues mentioned in the problem. Also, it gives a lot of customization options.

Comments