簡體   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