【发布时间】:2014-06-06 06:57:27
【问题描述】:
我正在处理 Roslyn extension 以警告 .Value 对 Nullable<T> 值的未受保护的访问。
这提供了以下行为:
这个扩展已经可以工作了,但是测试访问是否“安全”的代码有点像 hack。我现在只是遍历语法树,looking for if statements。
这种方法很丑陋,并且会产生一堆无效的警告。
以下是访问x.Value 应该是安全的一些示例:
int y;
int? x = foo();
y = x != null ? x.Value : 42;
if (x > 4)
y = x.Value;
if (x != null && someExpr) // With && only one branch needs to be a test
y = x.Value;
if (x == 3 || x == 4) // With || both branches must be a test
y = x.Value;
if (x == null) return; // Exit method body before access .Value
y = x.Value;
有没有办法使用SemanticModel 来正确编写这个测试?
我正在考虑的一件事是在语法树上执行Abstract interpretation。但这似乎需要做很多工作,我希望不需要一个成熟的抽象解释器。
我不太清楚 Roslyn 是如何实现死代码分析的,但似乎与此有些相关。
【问题讨论】:
-
我认为你的例子有一个错误:如果 bar == true 和 x == null,这将崩溃。 ||我认为,操作员在“安全”方面应该是对称的(尽管左侧可能意味着右侧的安全)。
-
应该是
&&,而不是|| -
而您所要求的称为可达性分析。
-
Roslyn 的实现是内部的,可以在source.roslyn.codeplex.com/#Microsoft.CodeAnalysis.CSharp/…找到
-
@SLaks:实现是一个公共 API,你可以调用 SemanticModel.AnalyzeDataFlow。不过,汤姆需要更强大的东西。