罗斯林分析仪 - 检查特定类型的零引用

发布于 2025-02-09 05:06:08 字数 2240 浏览 0 评论 0原文

我正在检查是否有可能为我们的系统构建自定义Roslyn分析仪。

该解决方案在.NET框架4.8中。我从教程开始如何编写CSHARP Analyzer代码修复并从那里开始。

我要检查的第一种情况是,当程序员使用特定服务的值时,他们不得假设结果不是null。

采用此服务定义:

public interface IConfigurationService
{
   Task<IConfiguration> GetConfiguration(string clientId);
}

以及要分析的代码示例:

public async Task DoSomeTask(string clientId)
{
   var configuration = await _configurationService.GetConfiguration(clientId);
   
   // This line should raise a warning because this specific client may not be configurated
   var serviceUri = configuration.ServiceUri;
   DoSomeSubTask(serviceUri);
}

到目前为止,我已经知道了,

public override void Initialize(AnalysisContext context)
{
   context.ConfigureGeneratedCodeAnalysis(GeneratedCodeAnalysisFlags.None);
   context.EnableConcurrentExecution();

   // The goal is to target the variable declaration (var configuration = ...)
   context.RegisterSyntaxNodeAction(
      AnalyzeDecalaration, 
      SyntaxKind.LocalDeclarationStatement
   );
}

private static void AnalyzeDecalaration(SyntaxNodeAnalysisContext context)
{
   // Check for the type of the variable and exit if it is not 'IConfiguration'
   var symbolInfo = context.SemanticModel.GetSymbolInfo(localDeclaration.Declaration.Type);
   var typeSymbol = symbolInfo.Symbol;
   if (typeSymbol.Name != "IConfiguration") 
   {
      return;
   }

   // Stuck here. I'm pretty sure dataFlowAnalysis is the key, but I can't figure how to use it
   var dataFlowAnalysis = context.SemanticModel.AnalyzeDataFlow(localDeclaration);
   var variable = localDeclaration.Declaration.Variables.Single();
   ISymbol variableSymbol = context.SemanticModel.GetDeclaredSymbol(
      variable, 
      context.CancellationToken
   );
}

所以我就是我的位置。我已经针对目标类型的变量声明。不多。

由于这是特定类型的特定案例,因此分析不必很花哨。对于典范,我不需要检查数组中iconfiguration的插入,这不是我们代码库中的事情。基本上是无效检查的Juste属性访问。

I am checking for the possibility to build custom roslyn analyzer for case specifics to our system.

The solution is in .net Framework 4.8. I started with the tutorial How to write csharp analyzer code fix and am making my way from there.

The first case I want to check is that when the programmer use the value of a specific service they must not assume that the result is not null.

Take this service definition :

public interface IConfigurationService
{
   Task<IConfiguration> GetConfiguration(string clientId);
}

And a code sample to analyze :

public async Task DoSomeTask(string clientId)
{
   var configuration = await _configurationService.GetConfiguration(clientId);
   
   // This line should raise a warning because this specific client may not be configurated
   var serviceUri = configuration.ServiceUri;
   DoSomeSubTask(serviceUri);
}

So far I got this

public override void Initialize(AnalysisContext context)
{
   context.ConfigureGeneratedCodeAnalysis(GeneratedCodeAnalysisFlags.None);
   context.EnableConcurrentExecution();

   // The goal is to target the variable declaration (var configuration = ...)
   context.RegisterSyntaxNodeAction(
      AnalyzeDecalaration, 
      SyntaxKind.LocalDeclarationStatement
   );
}

private static void AnalyzeDecalaration(SyntaxNodeAnalysisContext context)
{
   // Check for the type of the variable and exit if it is not 'IConfiguration'
   var symbolInfo = context.SemanticModel.GetSymbolInfo(localDeclaration.Declaration.Type);
   var typeSymbol = symbolInfo.Symbol;
   if (typeSymbol.Name != "IConfiguration") 
   {
      return;
   }

   // Stuck here. I'm pretty sure dataFlowAnalysis is the key, but I can't figure how to use it
   var dataFlowAnalysis = context.SemanticModel.AnalyzeDataFlow(localDeclaration);
   var variable = localDeclaration.Declaration.Variables.Single();
   ISymbol variableSymbol = context.SemanticModel.GetDeclaredSymbol(
      variable, 
      context.CancellationToken
   );
}

So that's where I am. I have targeted variable declaration for the target type. Not very much.

Since it is a specific case for a specific type, the analysis does not have to be very fancy. For exemple, I don't need to check for instanaces of IConfiguration inside an array, that's not a thing in our code base. Basically juste property access without null check.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文