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