C# Roslyn:检查方法参数是否不能为null

C# Roslyn:检查方法参数是否不能为null,c#,.net,roslyn,C#,.net,Roslyn,使用Roslyn,我的目标是检查方法参数在取消引用之前是否被检查为不为null。当然,该检查可以采用子方法 我的方法是获取参数的第一个解引用,并在该参数和方法start之间搜索语法树以进行空检查。如何进行某种控制流分析,以确定参数为null时是否可以实现参数的第一次取消引用?这是一个过于宽泛的问题,只需稍加解释,您的最终目标是什么。您是否试图在空指针异常发生之前100%检测它们?(几乎不可能) 几个月前我自己写过静态分析,我没有使用roslyn,但这并不重要 检查此项,以了解可能的启动情况-当存

使用Roslyn,我的目标是检查方法参数在取消引用之前是否被检查为不为null。当然,该检查可以采用子方法


我的方法是获取参数的第一个解引用,并在该参数和方法start之间搜索语法树以进行空检查。如何进行某种控制流分析,以确定参数为null时是否可以实现参数的第一次取消引用?

这是一个过于宽泛的问题,只需稍加解释,您的最终目标是什么。您是否试图在空指针异常发生之前100%检测它们?(几乎不可能)

几个月前我自己写过静态分析,我没有使用roslyn,但这并不重要

检查此项,以了解可能的启动情况-当存在未使用的变量时,它会报告警告:

internal class UnUsedVariableWarningDefinition : ICodeIssue
{
    public IEnumerable<IssueReport> Analyze()
    {
        var usageMap = new Dictionary<string, int>(StringComparer.InvariantCultureIgnoreCase);
        var variableMap = new Dictionary<string, IdentifierNode>(StringComparer.InvariantCultureIgnoreCase);

        foreach (var node in NodeAnalyzerHelper.FindNodesDfs(Root))
        {
            var assignmentNode = node as AssignmentNode;
            if (assignmentNode != null)
            {
                var variableNode = assignmentNode.Identifier;

                int usages;
                if (!usageMap.TryGetValue(variableNode.Identifier, out usages))
                {
                    usageMap[variableNode.Identifier] = 0;
                    variableMap[variableNode.Identifier] = variableNode;
                }
            }
            else
            {
                // not really an assignmentNode,
                // let's see if we have detected the usage of IdentifierNode somewhere.
                var variableNode = node as IdentifierNode;
                if (variableNode != null)
                {
                    if (usageMap.ContainsKey(variableNode.Identifier))
                        usageMap[variableNode.Identifier]++;
                }
            }
        }

        foreach (var node in usageMap.Where(x => x.Value == 0).Select(x => variableMap[x.Key]))
        {
            yield return node.ConstructWarning("No usages of this variable found. Are you sure this is needed?");
        }
    }
}
内部类UnusedVariableWarning定义:ICodeIssue
{
公共IEnumerable分析()
{
var usageMap=新字典(StringComparer.InvariantCultureInogoreCase);
var variableMap=新字典(StringComparer.InvariantCultureInogoreCase);
foreach(NodeAnalyzerHelper.findNodeDfs(根)中的var节点)
{
var assignmentNode=作为assignmentNode的节点;
if(assignmentNode!=null)
{
var variableNode=assignmentNode.Identifier;
国际惯例;
if(!usageMap.TryGetValue(variableNode.Identifier,out usages))
{
usageMap[variableNode.Identifier]=0;
variableMap[variableNode.Identifier]=variableNode;
}
}
其他的
{
//不是真正的assignmentNode,
//让我们看看是否在某处检测到IdentifierNode的使用。
var variableNode=作为标识节点的节点;
if(变量节点!=null)
{
if(usageMap.ContainsKey(variableNode.Identifier))
usageMap[variableNode.Identifier]+;
}
}
}
foreach(usageMap.Where(x=>x.Value==0)中的var节点。选择(x=>variableMap[x.Key]))
{
yield return node.ConstructWarning(“未找到此变量的用法。是否确实需要此变量?”);
}
}
}
请注意,
FindNodesDfs()
基本上是一个语法树遍历器,它以深度优先的方式遍历语法节点。它所做的只是扫描AssigfnmentNodes并将它们放入字典,一旦识别IdentifierNode,它就会检查字典是否以前遇到过赋值。我想这和你想做的有点相似