【发布时间】:2016-02-14 07:13:09
【问题描述】:
我们被要求审查涉及约 150 万行代码的客户端应用程序代码。该应用程序具有很高的稳定性,并且经常发生崩溃,我们的任务是通过手动静态代码审查来查找此类问题的根本原因。目标是防止异常。我们的目标不是在它们发生后更好地处理它们。
下面我有两个例子来说明防御性编程以防止异常:在非强制逻辑的情况下和强制逻辑的情况下。
第一个例子(非强制性逻辑): 防御性编码(块 2 中的“if”条件)先于“obj”的使用。如果“obj”为空,则“if”条件跳过否则会导致异常的逻辑。我们可能在代码中存在“if”条件不存在的实例——应该添加它以防止异常。 我们想知道我们应该在多大程度上(努力)添加这种防御性逻辑。
第二个例子(强制逻辑): 在第二个示例中,“if”条件检查是否为空(块 3),跳过该逻辑是无效的,因为该逻辑是强制性的。在这种情况下,“if”条件必须抛出异常。 这种防御性逻辑不会提高稳定性:无论是由于空引用异常还是由于“if”条件引发异常都会引发异常。
我们被要求在代码中查找导致异常被抛出的模式,即为什么对象没有被设置 - 问题出在块 1 中的逻辑中。(在这个例子中:因为它只有在 SomeCondition 被设置时才会被设置不假)。
bool someCondition = false;
DataSet obj = null;
/*** Begin block 1 ***/
if(someCondition)
{
obj = new DataSet();
//Fill the obj with data
Populate(obj);
}
/*** End block 1 ***/
/*** Begin block 2 ***/
//Perform some non-mandatory logic
//defensive coding
if(obj != null && obj.Tables["Employee"] != null && obj.Tables["Employee"].Rows[5] != null)
{
DataRow row1 = obj.Tables["Employee"].Rows[5];
row1["FirstName"] = "Bob";
}
/*** End block 2 ***/
/*** Begin block 3 ***/
//Perform mandatory logic
//defensive coding
if (obj == null && obj.Tables["Employee"] == null && obj.Tables["Employee"].Rows[5] == null)
throw new Exception("Object obj cannot be null");
DataRow row2 = obj.Tables["Employee"].Rows[5];
row2["Role"] = "Manager";
/*** End block 3 ***/
我们正在对代码进行人工审查,但它是一个巨大的 ASP.NET MVC 应用程序,它与后端 WCF 服务通信,我们正在努力寻找模式。是否可以手动执行其他操作?是否有任何工具可以帮助我们找到这样的模式。
【问题讨论】:
-
我投票结束这个问题,因为它属于codereview.stackexchange.com。
-
150 万行代码由并不真正知道自己在做什么的开发人员编写,这是技术债务的山。确实没有解决该问题的工具或快速解决方案。静态分析工具可以通过报告他们认为可能存在问题的事情来帮助。但是像这样的代码库中的问题比几个空引用异常要远更深。
-
我会认真考虑/推荐重写。在这种特殊情况下,它的成本可能比尝试修补它并且仍然有一些不稳定的东西要少得多。当然前提是他们不使用与第一次相同的开发人员......
-
@Cᴏʀʏ 我没有要求任何人审查我的代码,这就是 codereview.stackexchange.com 的用途。我正在寻求有关如何审查代码并解决问题中描述的问题的想法
标签: c# exception design-patterns nullreferenceexception code-analysis