gcc の -pedantic-errors と -Werror=pedantic の違い 質問する

gcc の -pedantic-errors と -Werror=pedantic の違い 質問する

gcc で-pedantic-errorsと を使用する場合の違いは何ですか?-Werror=pedantic

GCC のドキュメントによると、違いがあります:

- 衒学的誤り

基本標準 ( を参照-Wpedantic) が診断を必要とする場合は常にエラーを出力します。これは、コンパイル時に未定義の動作がある場合や、標準に従って有効なプログラムのコンパイルを妨げない場合もあります。-Werror=pedanticこのオプションによって有効になるエラーと後者によって有効にならないエラーがあり、その逆もあるため、これは と同等ではありません。

-pedantic-errorsには含まれていて、 には含まれていないエラーは何ですか-Werror=pedantic?

-Werror=pedanticには含まれていて、 には含まれていないエラーは何ですか-pedantic-errors?

両方のタイプのエラーの例はありますか?

ベストアンサー1

gcc で -pedantic-errors と -Werror=pedantic を使用する場合の違いは何ですか?

それから (GCCC4.9 の新機能) そしていま (12.2 の) の違いは、後者のオプションは「pedantic」カテゴリの診断のみに影響し、それらを有効にしてエラーとして出力しますが、前者は GCC に

厳密なISO C[]で要求されるすべての警告を発行します。禁止された拡張機能を使用するすべてのプログラムと、ISO Cに準拠していないその他のプログラムを拒否します。

そして

基本標準 (を参照-Wpedantic) が診断を必要とする場合、[および] コン​​パイル時に未定義の動作が発生する場合、[および] 標準に従って有効なプログラムのコンパイルを妨げないその他の場合に、エラーを出力します。

この文脈では、どのような状況で規格が診断を要求するかを理解することが重要です。これは、(C17 5.1.1.3/1) に指定されています。

準拠実装では、前処理翻訳単位または翻訳単位に構文規則または制約の違反が含まれている場合、少なくとも 1 つの診断メッセージを生成する必要があります [...]。その他の状況では、診断メッセージを生成する必要はありません。

「制約」という用語は、仕様で明示的にそのように指定されている要件のいずれかとして理解されます。これらはすべて、コンパイル時にチェックできる性質のものです。これらは、正式な言語構文の補助として考えることができ、どのようなコードが有効な C であるかの定義を洗練します。これらは、構文と制約に準拠する C コードの意味を指定するセマンティック ルールよりもはるかに少ないです。構文ルールの要件への準拠は、コンパイル時に常に評価できるとは限りません。

デフォルトでは、GCC は C 構文および/または制約に準拠していない一部のコードを診断メッセージなしで受け入れます。/ またはオプションを有効にすると-pedantic-Wpedantic言語-pedantic-errorsの選択された方言に関連するほとんどの構文および制約違反を診断します。これは、GCC が準拠した C プロセッサとなるモードを提供することを目的としていますが、これらのオプションを使用しても GCC が診断しない制約違反がいくつかあるため、そこまでには至っていません。

-pedantic-errorsそれが解決されると、エラーとして診断される可能性のある診断が実際にいくつか存在しますが、実際に-Werror=pedanticはそうではありません。

:

    int y;
    uintptr_t x = &y;

C ではポインタから整数型への暗黙的な変換がないため、割り当ての動作が定義されていないにもかかわらず、GCC はデフォルトでそのコードを受け入れます。古い GCC はデフォルトで警告すら出しません。診断を発行する場合は、次のようになります。

test_ped.c: In function ‘main’:
test_ped.c:6:19: warning: initialization of ‘uintptr_t’ {aka ‘long unsigned int’} from ‘int *’ makes integer from pointer without a cast [-Wint-conversion]
     uintptr_t x = &y;

診断カテゴリは であることに注意してください。したがって、 でコンパイルしてもこの診断がエラーとして出力されないのはint-conversion当然です。ただし、 でコンパイルすると、-Werror=pedantic-pedantic-errors するこの診断がエラーとして発行されます。

私の知る限り、これは-pedantic-errorsエラーが発生するものと-Werror=pedantic発生しないものの特徴です。これらはすべて、GCC が診断する場合、「専門的な」ものとは異なるカテゴリで診断するものです。

-Werror=pedanticしかし、その逆の例、つまり ではなく-pedantic-errorsのみがエラーとして出力される診断例は特定できませんでした。しかし、マニュアルにそのような例が存在すると明示的に記載されていない限り、ドキュメントに書かれているように、-pedantic-errorsカテゴリ内の診断のスーパーセットがpedanticエラーとして出力される例は見つからないと思います。その点ではマニュアルが古くなっているのではないかと推測しますが、そもそもマニュアルが正しかったとしても、私は例に驚かされる覚悟はできています。

おすすめ記事