繁体   English   中英

严格的ISO C一致性测试

[英]Strict ISO C Conformance Test

我目前正在研究一个C项目,该项目需要在不同的建筑环境之间具有相当的可移植性。 该项目针对托管C环境中符合POSIX的系统。

实现良好可移植性的一种方法是按照所选标准进行编码,但是很难确定给定的翻译单元是否严格符合ISOC。例如,它可能违反某些翻译限制,或者可能依赖于未定义的行为,而编译环境中没有任何诊断消息。 我什至不确定是否有可能检查大型项目的严格符合性。

考虑到这一点,是否有任何编译器,工具或方法可以在给定的翻译单元标准(例如C89或C99)下测试严格的 ISO C一致性?

任何帮助表示赞赏。

通常,不可能找到未定义的运行时行为。 例如,考虑

void foo(int *p, int *q)
{
    *p = (*q)++;
    ...

如果p == q ,则未定义。 如果不解决停止问题,就无法提前确定是否会发生。

(编辑以纠正caf指出的错误。谢谢,caf。)

并不是的。 C标准未对必须接受的翻译单位设置任何绝对最低限制。 这样,编写一个非常准确的检查器将是微不足道的,但是在实践中完全没有用:

#include <stdio.h>

int main(int argc, char **argv) { 
    int i;
    for (i=1; i<argc; i++)
        fprintf(stderr, "`%s`: Translation limit (potentially) exceeded.\n", argv[i]);
    return 0;
}

是的,无论多么琐碎,这都会拒绝一切 这符合标准。 正如我所说,在实践中它完全没有用。 不幸的是,您并不能真正做得更好-当您决定移植到其他实现时,可能会遇到一些以前从未见过的怪异的资源限制,因此,您编写的任何代码(包括“ hello world”),尽管在小型系统上使用了数十甚至数百个编译器,但仍可能超出资源限制。

编辑:

为什么“ hello world”程序不严格符合

首先,值得重申“严格符合”的定义:“严格符合程序应仅使用本国际标准中指定的语言和库的那些功能。2)不应产生依赖于任何未指定,未定义,或实施定义的行为,并且不得超过任何最低实施限制。”

实际上,有很多原因导致“ Hello,World”不严格符合。 首先,如上提示,实施限制的最低要求是完全没有意义的-虽然,必须有一定的程序,符合将要接受一定的限制, 没有其他程序必须接受,即使它甚至不能接近这些限制中的任何一个。 给出要求的方式后,(该程序最多)还有一个疑问,即程序是否存在不超过任何最小实施限制的事情,因为该标准并未真正定义任何最小实施限制。

其次,在翻译的第1阶段:“将物理源文件多字节字符以实​​现定义的方式映射到源字符集...”(第5.1.1.2/1节)。 自“你好,世界!” (或您喜欢的任何变体)在源文件中作为字符串文字提供,可以按实现定义的方式将其映射到源字符集。 一个实现可以自由决定(对于一个愚蠢的例子)字符串文字将是ROT13编码的,并且只要对该事实进行了适当的记录,它是完全合法的。

第三,通常通过stdout写入stdout stdout是文本流。 根据该标准:“可能必须在输入和输出上添加,更改或删除字符,以符合主机环境中表示文本的不同约定。因此,字符之间不必一一对应。在流和外部表示中。” (第7.19.2 / 2节)因此,实现可以(例如)对输出(星期一,星期三或星期五)进行霍夫曼压缩。

因此,我们(至少)有三个不同的点,它们分别来自“ Hello,World!”的输出。 取决于实现定义的特征-任何一个特征都将阻止它符合严格符合程序的定义。

gcc具有警告级别,将尝试确定ANSI一致性的各个方面。 但是帽子只是一个起点。

您可以从gcc -std=c99gcc -ansi -pedantic

祝你好运。 尝试避免带符号整数,因为:

int f(int x) 
{
 return -x;
}

可以调用UB。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM