2

警告 C4244 (データ損失の可能性) が抑制されていることを発見したばかりのプロジェクトがあります。一部の厄介な MS ヘッダーがこの警告を抑制し、そのヘッダーを含むすべての翻訳単位に対して抑制されたままになっているのではないかと強く疑っていますが、無数のヘッダーのどれに問題があるかはわかりません。

したがって、他のプログラミングの問題と同様に、バイナリ検索を実行して、現在の警告レベルを出力し、可能であればメインのプリコンパイル済みヘッダーで抑制された警告を出力したいと思います。

私がどのコンパイラディレクティブを使用するか、またはその情報を得るためにどのようなアプローチを取ることができるかを知っている人はいますか?

発信者がコントラクトに違反し、署名されたバイトの代わりに整数を送信しようとしたときに、ヘッダーで慎重に構築された型宣言がコンパイラの警告を出さないことがどれほど不快であるかはわかりません (これにより、私が解決しようとしている現在のバグ)。

考え?

ノート:

ソリューション全体で #pragma を検索すると、#pragma warning(disable:xxxx) とそれに続く #pragma warning(default:xxxx) のバランスの取れた宣言のみが表示されます。そして、それらのどれも 4244 を参照していません。

ソリューション全体で 4244 を検索すると、一致が返されません (その警告をオーバーライドしたり、含まれているライブラリやサブプロジェクトなどをオーバーライドしたりすることはありません)。

MS インクルード パス全体で 4244 を検索すると、呼び出し前に設定された #define シンボルに応じて、バランスが取れているか、ほぼバランスが取れているように見えるいくつかの参照が返されます。したがって、MSに問題があるという私の疑い(MSがヘッダーでずさんな作業をしているという以前の履歴と組み合わせて)。

4

4 に答える 4

1

別のオプションは、これを追加することです

#pragma warning (defualt) 

ファイルの先頭の s の直後#includeこれにより、警告がデフォルトにリセットされ、呼び出された可能性のあるすべての無視が破棄されます。

別の言い方をすれば、Microsoft ヘッダーが警告を無効にする可能性は非常に低いと思います。

于 2009-06-10T15:28:48.697 に答える
0

さらに調査した後:

/P 時間がかかりすぎます (1 時間近くかけて数ファイルを超えるのを目撃したことがないので、そのビルドをキャンセルしました)

現在の警告レベルが何であるか、またはコンパイルの特定の時点で有効だったオーバーライドを出力する明確な方法を見つけることができませんでした。したがって、/P 引数が実際に役立つ場合を除き、私が尋ねた質問には実際には答えられません (前述したように、私の目的には実用的ではありませんでした)。

私ができたのは、警告レベルにその警告がアクティブとして含まれている場合に必要な警告を生成する必要があるさまざまなヘッダーでいくつかのインライン呼び出しを作成し、その警告がアクティブかどうかを確認することでした:

inline int test(char value) { return ++value; }

「何か」を含む

inline int test1(int value) { return test(値); } // C4244 を生成する必要があります - 前の #include が警告レベルを台無しにしたり、警告 4244 をオーバーライドしたりしなかった場合、データが失われる可能性があります。

等々...

最終的に、私が発見したのは、特に 4244 にはいくつかの奇妙なルールが関連付けられており、最高の警告レベルである /W4 (警告レベル 4) を除くすべてで事実上「無効」になっていることです。その警告レベルは非常に扱いにくく、私たちが対処できる範囲をはるかに超えている多くのことについて不平を言っているため、/W4 を有効にしたくありませんでした。

代わりに、stdafx.h PCH に次のコードを追加しました。

pragma warning(error:4244) // これにより、アクティブな警告レベルに関係なく、すべての状況で暗黙的な型変換によるデータ損失の可能性に対する警告が完全に有効になります

それはうまくいきました。

そのため、MS は、私たちに影響を与えたどのファイルにも、バランスの取れていない警告の上書きを残しませんでした。とにかく、4244 が非常に寛容であることは、最高の警告レベルを除いて、とにかく私たちにとって本当に役立つということでした.

ご協力いただきありがとうございます!

于 2009-06-10T17:52:08.847 に答える
0

「C4244」のすべてのヘッダー ファイルを検索できますか、それとも、コンパイル済みのヘッダー ファイルにしかアクセスできませんか?

于 2009-06-10T15:25:30.577 に答える
0

/P コンパイラ コマンド ライン オプションを使用して開始できます。プリプロセッサの出力をファイルに出力します。このようにして、警告を無効にするヘッダーが実際に追加されていることを実際に確認し、それがどのヘッダーであるかについてのヒントを収集しようとすることができます。

于 2009-06-10T15:25:45.193 に答える