MISRA C:2012规则1.3和C与C++的弱点 MISRA C是安全使用C编程语言的一套准则,主要使用在安全关键的嵌入式系统中。它的许多规则和指令旨在帮助软件开发人员编写更易于理解和维护的代码。软件开发工作需要团队合作,这些编程风格类的规则是重要的,有益于理解源代码。其他规则禁止进行有风险的设计或已知的不良编程行为。

编程风格类规则的一个很好的例子是规则5.3“在内部作用域中声明的标识符不应掩盖在外部作用域中声明的标识符”。这显然是一种关于编码风格的警告。违反此规则本身不会导致程序崩溃,但是这样的声明会使代码更难于理解,因为内部标识符混淆了外部标识符。

违反这种编程风格类准则通常很容易被静态分析工具发现。对于规则5.3,工具可以精确地找到内部声明掩盖了外部声明的位置。MISRA将该规则列为“可判定的(Decidable)”,意味着静态分析工具对此类问题的发现是很少或者没有误报的。

规则1.3和未定义行为

MISRA-C:2012规则1.3是完全不同的类别。它指出“不得发生未定义或严重未指定的行为”。通常,人们并不完全理解此规则的重要性以及对违反此规则的检查的复杂性。未定义行为可谓是C编程语言的“阿喀琉斯之踵”,编程时很容易犯下导致未定义行为的错误,后果是灾难性的。如果您很走运,该程序将立即崩溃,在这种情况下,原因比较明显;如果您不走运,未定义行为将潜在地破坏程序状态,程序执行错误的操作,最终呈现难以理解的特征而彻底失败。未定义行为是由某些错误引起的,例如缓冲区溢出、读取未初始化的内存、间接引用无效的地址、甚至是像数据竞争之类的并发问题。许多最严重的安全漏洞的根本原因就在于未定义行为。

C90/C99的标准列出了未定义行为的230个实例,尽管一些行为被MISRA C:2012明确禁止,但仍有将近四分之一未被规则1.3之外的其他规则覆盖。因此,这条规则涵盖了很多方面。

我认为规则1.3是MISRA规则集中最重要的一条规则,因为消除未定义的行为将直接解决功能安全问题。

查找未定义的行为需要静态分析工具来推理程序的深层语义。轻量级的工具也许能够找到一些实例,但它需要非常复杂的机制来发现真正严重的缺陷。这涉及到跨源文件的各个部件的复杂的控制流和数据流。能够实现这一点的静态分析工具使用全程序数据流和控制流分析技术,典型的是使用抽象解释的形式。

在开发周期中尽可能多地检测和解决这些问题是至关重要的。最近,我与一位客户进行了交谈,该客户花了4个星期的工程时间来尝试查找未初始化的变量问题。我们的静态分析工具CodeSonar有能力立即发现问题,是因为CodeSonar 的使命就是查找最严重的软件缺陷和最危险的安全漏洞。

真正的功能安全比合规性更重要

现在有些组织要求代码符合MISRA C。这是一件好事,因为许多MISRA C规则都规定了什么样的代码才更易于理解和维护,这也非常重要。但是,让合规性成为静态分析工作的唯一驱动力却存在着很大的危险,因为过分关注代码的表面属性会导致您看不到功能安全问题,这才是最重要的事实。一个简单化的静态分析工具可能不会报告程序的违规情况,而由于未定义的行为,该程序可能会充满严重缺陷。因此,擅长发现违反规则1.3的静态分析工具要比只发现违反浅层属性的工具更有价值。

CodeSonar能够发现的严重的软件缺陷是同类静态分析工具的五倍。是的,这可能意味着您的团队必须分类鉴别更多的静态分析警告,但是这样做也具有很大价值,因为这同样意味着您可以在错误更容易被修复的早期发现它们。

更多信息:http://www.softtest.cn/

分类:

技术点:

相关文章: