3

今日、私たちは異常な現象に遭遇しました。同僚が彼のコードで通常は正常に動作する関数を呼び出していて、libc(gethostbyname)でセグメンテーション違反を引き起こしていました。困惑したのは、同じランタイムの他のソースファイルで同じ関数が問題なく動作したことです。驚いたことに、valgrindを使用すると、segfaultは消えました。実際、valgrindで完全に機能し、エラーは報告されていません。

コンパイラの神々をなだめるために多くの犠牲を払った後、私たちは最終的に、関数を宣言するヘッダーファイルが関数を呼び出すソースファイルから欠落していることに気付きました。これを追加すると、すべてが正常に実行されました。

gcc / ldが関数が認識されなかったことを示すエラー(または警告)を生成しなかったのはなぜですか?、なぜvalgrindで機能したのですか?

ありがとう。

4

1 に答える 1

9

などの適切な警告オプションを使用しなかったためです-Wall -Wmissing-prototypes -Wstrict-prototypes。デフォルトでは、gccはそれが受け入れるものに関して非常に寛大です。C言語(少なくともC89)には、暗黙的な関数宣言の概念があります。プロトタイプのない関数には、関数呼び出しでの最初の使用から派生した戻り型と引数リストがあり、それがない場合は、intを返し、不特定のものを受け取ります。ただし、引数の数は固定されています(つまり、vararg関数にすることはできません)。

于 2012-07-27T12:15:42.557 に答える