11

私は現在、さまざまな建物環境間でかなり移植性が必要なCプロジェクトに取り組んでいます。このプロジェクトは、ホストされたC環境上のPOSIX準拠システムを対象としています。

優れた移植性を実現する1つの方法は、選択した標準に準拠してコーディングすることですが、特定の翻訳単位がISO Cに厳密に準拠しているかどうかを判断することは困難です。たとえば、一部の翻訳制限に違反している可能性があります。コンパイル環境からの診断メッセージがなくても、未定義の動作に依存している可能性があります。大規模なプロジェクトの厳密な適合性をチェックできるかどうかさえわかりません。

それを念頭に置いて、翻訳ユニットの特定の標準(C89やC99など)の下で厳密なISO C適合性をテストするためのコンパイラ、ツール、または方法はありますか?

どんな助けでも大歓迎です。

4

5 に答える 5

5

一般に、未定義の実行時の動作を見つけることはできません。たとえば、

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

の場合は未定義ですp == q。それが起こり得るかどうかは、停止性問題を解決せずに事前に決定することはできません。

(指摘された間違いを修正するために編集されました。ありがとう、カフェ。)

于 2010-08-09T21:16:24.730 に答える
4

あまり。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 ")は、はるかに小規模なシステム上または数百のコンパイラで許可されているにもかかわらず、リソース制限を超える可能性があります。

編集:

「HelloWorld」プログラムが厳密に準拠していない理由

まず、「厳密に準拠する」の定義を言い換える価値があります。「厳密に準拠するプログラムは、この国際規格で指定されている言語とライブラリの機能のみを使用するものとします。2)未指定、未定義、または実装定義の動作であり、実装の最小制限を超えてはなりません。」

「Hello、World」が厳密に準拠していない理由は実際にはいくつかあります。まず、上記のように、実装制限の最小要件は完全に無意味です。受け入れられる特定の制限を満たすプログラムが必要ですが、のプログラムは、たとえそれが近づいていなくても、受け入れられる必要はありませんそれらの制限のいずれかに。要件の記述方法を考えると、標準では実際には最小実装制限が定義されていないため、最小実装制限を超えないプログラムなどがあるかどうかは(せいぜい)疑問視されます。

次に、翻訳のフェーズ1で、「物理ソースファイルのマルチバイト文字は、実装で定義された方法で、ソース文字セットにマップされます...」(§5.1.1.2/ 1)。「Hello、World!」以降 (または任意のバリアント)は、ソースファイルで文字列リテラルとして提供され、実装定義の方法でソース文字セットにマップできます。実装は、(ばかげた例では)文字列リテラルをROT13でエンコードすることを自由に決定でき、その事実が適切に文書化されている限り、それは完全に正当です。

第三に、出力は通常、を介して書き込まれstdoutます。stdoutテキストストリームです。標準によると、「ホスト環境でテキストを表すためのさまざまな規則に準拠するために、入力と出力で文字を追加、変更、または削除する必要がある場合があります。したがって、文字間に1対1の対応がある必要はありません。ストリーム内および外部表現内のもの。」(§7.19.2/ 2)そのため、実装は(たとえば)出力に対してハフマン圧縮を実行できます(月曜日、水曜日、または金曜日)。

したがって、「Hello、World!」からの出力には、(少なくとも)3つの異なるポイントがあります。実装で定義された特性に依存します。いずれの特性でも、厳密に準拠したプログラムの定義に適合できなくなります。

于 2010-08-09T21:06:35.830 に答える
-1

gccには、ANSI適合のさまざまな側面を特定しようとする警告レベルがあります。しかし、帽子は出発点にすぎません。

于 2010-08-09T21:08:49.180 に答える
-1

gcc -std=c99、、またはで始めることができgcc -ansi -pedanticます。

于 2010-08-09T21:22:03.577 に答える
-1

それで頑張ってください。次の理由から、符号付き整数は避けてください。

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

UBを呼び出すことができます。

于 2010-08-10T05:28:41.177 に答える