ICC のポインターチェッカーにはダイナミック・リンク・ランタイム・ライブラリーが必要

同カテゴリーの次の記事

インテル® コンパイラーのバージョンとインテル® Parallel Studio XE (Composer、Professional、Cluster の各エディション) のバージョンの対応表

この記事は、インテル® デベロッパー・ゾーンに公開されている「Pointer Checker in ICC: requires dynamic linking of runtime libraries」の日本語参考訳です。


インテル® Parallel Studio XE 2016 以降で利用可能なポインターチェッカー機能を有効にする -check-pointers オプションは、すべてのインテル® ライブラリーを静的にリンクする -static オプション (Linux*) または /MT オプション (Windows*) と一緒に使用できません。これは、ポインターチェッカーの “libchkp.so” ライブラリーは設計上、重複することなく、プロセス内のすべての実行ファイルとライブラリーで共有されなければならないためです。単一のライブラリー・コピーがリンクされるように手動で確認することは確かに可能ですが、テストからユーザーがライブラリーの複数のコピーを誤って含めて予測できないエラーを引き起こしやすいことが分かりました。そのため、ポインターチェッカーと -static または /MT を一緒に使用することはできません。

-check-pointers でコンパイルされたプログラムを Linux* システムリンカーの “ld” でリンクする場合、libchkp.so と libchkpwrap.a ライブラリーを含める必要があります。これらのライブラリーは、通常 /opt/intel/composerxe/lib/<intel64 または ia32> ディレクトリーにあります。”icc” または “icpc” コンパイラー・ドライバーを使用してリンクする場合、”-check-pointers:rw” または “-check-pointers:write” オプションを指定すると、これらのライブラリーが自動的に含めれます。

例:
icc -o executable -check-pointers:rw a.o b.o c.o
または
ld -o executable a.o b.o c.o -L/opt/intel/composerxe/lib/intel64 -lchkp -lchkpwrap

-check-pointers でコンパイルされるプログラムコードが -check-pointers でコンパイルされないコードを呼び出し、呼び出し先のコードが呼び出し元のポインターを変更する可能性がある場合、コンパイラーは保守的な仮定を行い、不正確な結果になることがあります。そのため、関連するプログラム単位はすべて同じポインターチェッカー・オプションでコンパイルすることを強く推奨します。memcpy() や new などの典型的な C/C++ ライブラリー呼び出しは、コンパイラーによりポインターチェッカーと互換性のあるバージョンに自動変換されるため、特別な処理は必要ありません。

注: –static-intel オプションを指定すると、コンパイラーはポインターチェッカーのダイナミック・ランタイム・ライブラリーにリンクしてそのことを示すメッセージを出力しますが、-static オプションを指定するとリンク時にエラーになります。

コンパイラーの最適化に関する詳細は、最適化に関する注意事項を参照してください。

関連記事