开始免责声明:
我是一个团队的一员,该团队开发了一个测试套件来验证 C/C++ 编译器并验证编译器的功能安全性。
结束免责声明
这是可能的。该过程称为“资格”而不是认证,因为它旨在发现编译器中的任何弱点并在需要时定义解决方法。在 ISO 26262 中,可以在第 8 部分第 11 节“使用软件工具的信心”中找到它。本例中的“软件工具”就是编译器。
第 11.4.9.2 节说:
11.4.9.2 The validation of the software tool shall meet the following criteria:
the validation measures shall demonstrate that the software tool complies with
its specified requirements,
...
EXAMPLE
The standard for a programming language helps to define the requirements for
validating the associated compiler.
说明必须与 ISO 标准保持一致。要进行验证,您需要一个基于语言标准的测试套件。
DejaGNU 套件不适合对编译器的功能安全进行限定。 DejaGNU 有助于识别您的编译器版本中是否存在一些“众所周知的问题”,但它不会根据任何 ISO 标准系统地验证编译器。它主要是一个回归测试套件,并测试了许多 ISO 标准中没有的要求。以下是一些例子:
例如 1:
https://github.com/gcc-mirror/gcc/blob/master/gcc/testsuite/c-c%2B%2B-common/diagnostic-format-json-1.c
此测试测试编译器是否生成 JSON 格式的诊断消息,这不是 ISO/IEC-9899:* C 标准、ISO/IEC-14882:* C++ 标准或 ISO-26262 标准所要求的。
例如 2:
https://github.com/gcc-mirror/gcc/blob/master/gcc/testsuite/g%2B%2B.dg/tree-ssa/pr13954.C
如果您的编译器未实现任何类型的条件常量传播优化,则此测试“失败”,但 C++ 标准和任何功能安全标准均不要求这样做。
例如 3:
另一方面,通过 DejaGNU 套件并不表示符合标准,而只是符合 GNU“方言”:
https://cpp.godbolt.org/z/Gyu_i5
验证编译器在应用程序开发中使用的选项、配置和环境也很重要。这通常称为“用例”。 ISO 26262 说:
11.4.3.1
When using a software tool, it shall be ensured that its usage, its
determined environmental and functional constraints and its general
operating conditions comply with its evaluation criteria or its
qualification.
正如@stephen m 正确提到的。韦伯测试是认证过程的一部分。
另一部分是记录过程、测试结果和缓解措施(解决方法)。
验证编译器后,您可以在任何安全关键型环境中重复使用它,只要用例相同。