Roslyn:检查方法参数是否不能为空
本文关键字:不能 是否 参数 检查 方法 Roslyn | 更新日期: 2023-09-27 18:15:29
使用Roslyn,我的目的是检查在参数解引用之前是否检查方法参数不为空。这个检查当然可以在子方法中。
我的方法是获得参数的第一个解引用,并在它和方法开始之间的语法树中搜索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?");
}
}
}
注意,FindNodesDfs()
基本上是一个语法树行走器,它以深度优先的方式行走语法节点。它所做的就是扫描assignmentnodes并把它们放到Dictionary中,一旦它识别出IdentifierNode,它就会检查字典是否以前遇到过赋值。我猜这和你想做的有点相似。