查找嵌入式C语言程序/软件中的缺陷的多种技术
我们的单元测试检测到reportSensorFailure()函数的行为已经发生了改变。这是由于我们已经对finalize()函数进行了修改—— 为了纠正之前报告的一个问题所做的修改。此处报告的任务是为了让我们注意此修改,并提示我们应该对测试用例进行相应的审查,并且确定是否应该对代码或者测试用例进行相应的修改,以表示这种新的行为实际上是我们所预期的行为。在检查完代码之后,我们发现后者(修改)是正确的并且应该更新断言的正确条件。
/* CPPtest_TEST_CASE_BEGIN test_reportSensorFailure */
/* CPPTEST_TEST_CASE_CONTEXT void reportSensorFailure(void) */
void sensor_tests_test_reportSensorFailure()
{
/* Pre-condition initialization */
/* Initializing global variable messages */
{
messages = 0 ;
}
{
/* Tested function call */
reportSensorFailure();
/* Post-condition check */
CPPTEST_ASSERT(0 == ( messages ));
}
}
/* CPPTEST_TEST_CASE_END test_reportSensorFailure */
作为最终的确认,我们需要独立地运行整个程序——在IDE中关闭掉运行时内存监测来对程序进行构建。结果显示一切如我们所预期一样运行。
总结
作为全文的结尾,让我们一起对上述各个步骤进行一个鸟瞰式的总结。
首先,我们开发的程序并未如我么所预期那样运行,我们不得不在两种解决方法中选择一种来查找程序中的错误:通过运行调试器或者使用自动错误检测技术。
如果我们使用调试器运行代码来查找错误,我们将会看到一些很奇怪的现象:程序中的一些变量总是被赋予了相同的值。基于这种现象我们不得不通过排除法来查找问题的原因——即在应该使用比较运算符的地方我们错误地使用了赋值运算符。而静态代码分析则能为我们自动地检查出该逻辑错误。运行时内存分析是不可能检查出这种错误的,因为这种错误与内存无关。数据流分析也很有可能找不到这类错误因为数据流分析仅仅是通过这些路径而不会验证这些条件的正确性。