我們正在開發一個靜態代碼分析工具,旨在通過一些提示改進代碼。如何在靜態代碼分析工具中找到NullReferenceException的潛在點?
我們希望找到開發人員忘記檢查變量或屬性或方法返回的可空性並通過點符號訪問成員的地方,因爲它可能遇到NullReferenceException。
例如下面的代碼:
class Program
{
static void Main(string[] args)
{
var human = new Human();
if (human.Name.Length > 10)
{
// Jeez! you have a long name;
}
}
}
public class Human
{
public string Name { get; set; }
}
我們使用Mono.Cecil能做到,我們發現在一個特定的裝配所有類型的所有方法的身體,併爲每個方法體,我們發現它的說明,並然後我們檢查Callvirt操作。然而,這並不支持這個例子:
class Program
{
static string name;
static void Main(string[] args)
{
if (name.Length > 10)
{
}
}
}
我們如何才能找到所有的訪問給定可空類型的成員(變量,字段,屬性,方法)?
更新: 事實上,我們正在尋找代表在IL給定的變量成員訪問操作碼。這可能嗎?
你想創建一個工具,它使用反射進行靜態代碼分析*,這是一個不小的技巧*,但是有關於如何使用反射的基本問題?我認爲你是在這匹馬前面放馬。我建議你先學習所有關於反射的知識。然後,您需要了解如何破壞方法,以便您的代碼可以找到像上面這樣的情況(這是更難的部分)。哦,是的,之後你將不得不通知用戶(不知道這是內聯還是通過控制檯輸出)。順便說一下,那裏有很多工具可以完成這些工作。 – Igor
像https://www.jetbrains.com/resharper這樣的工具會讓你知道(內聯)是否存在NullReferenceException的可能性等等。 –
@Igor我們已經使用*簽入策略*開發了基於* TFS *的代碼分析/質量。目前,它檢查了我們定義的超過180條規則,以提高大約15位開發人員開發的多個龐大代碼庫的質量。 這個問題是關於一個我們想要添加的新規則 - 每當需要時應該在那裏檢查,以防止NullReferenceException。 –