Misra C:写安全,更清晰的C代码

嵌入式开发人员经常Bemoan,没有编程语言是理想的理想选择。在某种程度上,这种情况是不熟悉的,因为,虽然很多众多开发人员正在嵌入嵌入式应用程序,但它们仍然只有世界上编程社区的一个小子。尽管如此,有些语言已经开发了嵌入式。值得注意的例子是PL / M,第四和ADA,所有这些都被广泛使用,但从未普遍接受过。其他语言,如Rust,正在获得支持,但尚未主流。几乎普遍采用的妥协是C.如何妥协妥协最有效的工作?

C语言紧凑,表现力和强大。它为程序员提供了编写高效,可读和可维护的代码的方法。所有这些功能都占其普及。不幸的是,该语言还使不明智的开发人员编写危险,不安全的代码,这些代码可能会在开发项目的所有阶段造成严重问题并进入部署。对于安全和/或安全是一个重大优先级的申请,这些语言的缺点是一个主要问题。

它反对这个背景,在20世纪90年代后期,电机行业软件可靠性协会(Misra)推出了一套用于在车辆系统中使用C的指南,这被称为Misra C.从那时起,指南已经稳步精致,更新从时刻发布。也建立了类似的C ++方法。虽然指南最初是针对汽车的软件开发人员,但它很快意识到它们同样适用于许多安全性至关重要的应用领域,而该标准现在在许多行业中被广泛采用。

虽然MISRA C不是风格指南 - 确实很多用户应用样式指南以及标准 - 众多规则也促进了清晰可读可维护的代码的写作。这是非常有益的,因为要理解的代码不太可能怀有微妙的错误或未定义的行为。

臭臭C的完整细节可从中获得 //misra.org.uk 并且有许多工具可提供支持此方法。

我将在这里发出指导方针的味道。我的参考文献来自Misra C:2012第三版,第一次修订。 MISRA C正在不断审查中,增量变更解决了指导方针的清晰度和准确性,并对新版本的C语言标准提供了支持。虽然细节变化,但整体哲学和方法没有。

规则13.2–在所有允许的评估订单下,表达的价值及其持续副作用应相同

C语言标准对表达式评估顺序提供了非常宽的纬度。任何对评估顺序敏感的代码都是敏感的,因此,编译器依赖于编译和编译器相关的代码应始终被视为不安全。

例如,使用增量和减量运算符可能是麻烦的:

val = n ++ + arr [n];

哪个元素 arr. 被访问?程序员是否期望价值 n 用于将数组索引到递增之前或之后?虽然它可能看起来好像在数组索引之前执行递增,但是假设左右表达式评估,这不是有效的假设。因此,代码不明确,因此应该重新编写:

val = n + arr [n + 1];
n ++;

或者

val = n ++;
val + = arr [n];

甚至

val = n;
n ++;
val + = arr [n];

您选择的这些选项中的哪一个取决于个人风格。它们都执行相同的操作,实际上,优化编译器很可能会产生完全相同的代码。

在表达式中使用的多个函数调用可能会发生类似的问题。函数调用可能具有影响另一个的副作用。例如:

val = fun1()+ fun2();

在这种情况下,如果任一函数可能影响其他结果,则代码是模糊的。要编写安全代码,必须删除任何可能的歧义:

val = fun1();
val + = fun2();

现在明确了 fun1() is executed first.

规则17.2–功能不应直接或间接呼唤自己

不时,通过使用递归来表达算法的优雅方式。但是,除非递归非常紧密,否则堆栈溢出的危险,否则可以依次导致非常困难地定位错误。在安全临界代码中,应避免递归。

规则19.2–不应使用union关键字

虽然C是一种类型的语言,但键入不是非常强制强制执行的,并且开发人员可能会省略键入键入“简化”其代码。遵守数据类型的约束对于创建安全代码至关重要,因为任何绕过数据类型的尝试都可以产生未定义的结果。这 联盟 关键字可以用于许多目的,这通常会导致代码不明,但也可以是规避键入的手段。

一个示例将使用一个工会“拍摄”一个无符号整数,因此:

联盟E.
{
   unsigned int ui;
   unsigned char a[4];
}F;

在这种情况下,每个字节 UI. 可以作为一个元素访问 a。但是,我们无法确定是否 a[0] 是最重要的字节是最重要的,因为这是一个实现问题。 (基本上与处理器的endianity相关联。)替代方案可能是使用换档和掩蔽,因此:

unsigned char getbyte(未签名int输入,unsigned int index)
{
  input >>= (index * 8);
  return input & 0xff;
}

可能有人认为,这些规则(以及最多,如果不是全部,isrra c)只是常识,任何好程序主人都会采取这种方法。这可能是真的,但一套明确的指导方针会少才能少到机会。


相关内容:

更嵌入, 订阅嵌入式 ’S每周电子邮件时事通讯.

发表评论

本网站使用AkisMet减少垃圾邮件。 了解如何处理评论数据.