メインコンテンツ

このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。

コンパイルおよびリンクのエラーのトラブルシューティング

コンパイラで正常にビルドされたコードに対して Polyspace® の検証を実行します。コードが正常にビルドされたら、次のいずれかの方法で Polyspace プロジェクトを設定します。

  • ビルド システムをトレースします。

    ソフトウェアにより、ビルド スクリプトからプロジェクトが作成されます。ビルド オプションをエミュレートするための適切な Polyspace 解析オプションが設定されます。

  • ビルド システムをトレースできない場合は、Polyspace プロジェクトを手動で作成します。

    ソースとインクルードをプロジェクトに追加します。必要に応じて、既定の解析オプションを変更します。

詳細は、解析の設定と実行を参照してください。

プロジェクトを手動で設定する場合のよくある問題を次に示します。

問題

ランタイム エラーの検証と検出の前に、Polyspace でコードがコンパイルされ、コンパイル エラーとリンク作成エラーが検出されます。コンパイラではコードが正常にビルドされた場合も、Polyspace でコンパイル エラーが発生します。

コンパイル段階

コンパイル エラー

考えられる原因: 標準からの逸脱

Polyspace コンパイラは C または C++ 規格に厳密に準拠します。C 標準バージョン (-c-version) および C++ 標準バージョン (-cpp-version) を参照してください。この規格からの逸脱がコンパイラで許容されている場合、Polyspace の既定のオプションを使用したコンパイルではコンパイラをエミュレートできません。たとえば、Polyspace の既定の設定では認識されない特定の非 ANSI® キーワードがコンパイラで許容されている場合があります。

特定のランタイム エラーがないことを保証するために、Polyspace の既定のコンパイルは規格に厳密に準拠しています。特定のコンパイラでは、この規格からの特定の逸脱を許容し、内部アルゴリズムに従ってコードをコンパイルします。コンパイラの動作に関する明示的な情報がないと、Polyspace ではそれらの逸脱に対応できません。それらの逸脱にいくつかの任意の内部アルゴリズムで対応することにより、Polyspace のアルゴリズムとコンパイラのアルゴリズムが一致しない場合に最終的な解析結果で問題が生じる可能性があります。

コンパイル エラーの原因となったエラー メッセージをチェックし、規格からの逸脱を特定できるかどうかを確認します。エラー メッセージに、コンパイル エラーの原因となった行番号が示されます。ユーザー インターフェイスから検証を実行している場合は、エラー メッセージをクリックして対応するコード行に移動できます。

解決法

次のオプションを手動で調整して、より厳密にコンパイラをエミュレートするように解析オプションを変更します。

オプション目的
ターゲットおよびコンパイラのオプション

これらの事前定義されたオプションを使用して、コンパイラの動作を直接指定し、規格からの既知の逸脱に対処できます。

多くの場合、コンパイラ (-compiler)を適切に設定すればコンパイラを十分にエミュレートできます。

これらのオプションを使用して、規格からの不明な逸脱に対処できる場合があります。

たとえば、これらのオプションを使用して、前処理済みのコードの認識されないキーワードをほぼ一致する認識されるキーワードに置き換えたり、完全に削除したりできます。ソース コードを変更する必要がないため、これらのオプションを使用するとソース コードはそのままでコンパイル エラーに対処できます。

Polyspace 解析が停止したときのエラー情報の表示も参照してください。

具体的なコンパイル エラーのタイプについては、コンパイル エラーのトラブルシューティングを参照してください。

コンパイル エラーを解決できない場合は、MathWorks® テクニカル サポートに連絡して、適切なサポートを受けられるようにコンパイラ名を伝えてください。Polyspace 実行時の問題に関するテクニカル サポートへのお問い合わせを参照してください。

考えられる原因: リンク作成エラー

コンパイル ユニット単体では正常にコンパイルされた場合でも、2 つのコンパイル ユニットの間の不一致が原因でリンク作成エラーが発生します。たとえば、同じ関数が 2 つの .c ファイルで定義されていて、それらの間で引数や戻り値の型が異なっている場合などです。

一般的なコンパイル ツールチェーンでは、リンク作成プロセスで関数プロトタイプに関する情報は格納されません。そのため、これらのタイプのリンク作成エラーがあってもビルドは失敗しません。Polyspace では、特定のランタイム エラーがないことを保証するために、そのようなリンク作成エラーが発生すると解析が続行されません。

解決法

Polyspace で検出されたリンク作成エラーを修正します。それらのエラーは、ビルド プロセスでは許容される場合でも、実行時に予期しない結果をもたらすことがあります。たとえば、コードに同じ名前の関数定義が 2 つあり、それらのプロトタイプに競合があると、その関数を呼び出したときに予期しない結果になる可能性があります。

リンク作成エラーが発生した場合、エラー メッセージに Polyspace のコンパイルが失敗したファイル内の場所が示されます。事前の警告メッセージにリンク作成エラーの原因となった競合の場所が示されます。それらのメッセージの行番号を使用して (ユーザー インターフェイスから解析を実行する場合はメッセージをクリックして)、コード内の競合の場所に移動できます。

たとえば、次のメッセージでは、関数の戻り値の型に競合があるためにコンパイルに失敗しています。file2.c の 5 行目で関数を呼び出したときにエラーが発生しています。事前の警告メッセージから、file1.c の 1 行目と file2.c の 1 行目で競合が発生していることがわかります。

具体的なリンク作成エラーのタイプについては、コンパイル エラーのトラブルシューティングを参照してください。

考えられる原因: Polyspace の関数スタブとの競合

Polyspace では、検証の効率を高めるために標準ライブラリ関数の独自の実装を使用します。コンパイラで標準ライブラリ関数を再宣言および再定義した場合、関数の呼び出し時に警告またはエラーが発生することがあります。

このエラーは、Polyspace で再宣言が見つかったが、再定義されたライブラリ関数の本体が見つからないことを意味します。検証では関数の Polyspace 実装が引き続き使用されますが、警告が表示されます。再定義された関数のシグネチャがその関数の標準のシグネチャと異なる場合は、エラーにより検証が停止します。

このタイプの警告とエラーは、多くの場合、ファイル __polyspace__stdstubs.c を参照します。このファイルには、標準ライブラリ関数の Polyspace 実装のプロトタイプが含まれています。このファイルは polyspaceroot\polyspace\verifier\cxx\polyspace_stubs\ にあります。polyspaceroot は Polyspace のインストール フォルダーです。

解決法

再定義された標準ライブラリ関数の本体を含むファイルの場所がわかっている場合は、そのファイルを検証に追加します。詳細は、Polyspace ヘッダー ファイルの使用によるエラーの修正を参照してください。

関数本体を使用できない場合:

  • このタイプの警告については、表示された警告を無視できます。検証結果は標準ライブラリ関数の Polyspace 実装に基づきます。コンパイラでの再定義が標準ライブラリ関数の仕様にほぼ一致していれば、コンパイラでコンパイルされたコードに検証結果を適用できます。

  • エラーが表示された場合:

    1. プロジェクトでマクロ __polyspace_no_function_name を定義します。たとえば、関数 sprintf の定義との競合が原因でエラーが発生した場合は、マクロ __polyspace_no_sprintf を定義します。マクロの定義方法の詳細については、プリプロセッサ定義 (-D)を参照してください。

      このマクロは、標準ライブラリ関数の Polyspace 実装の使用を無効にします。ソフトウェアにより、他の未定義の関数と同様に標準ライブラリ関数がスタブされます。Polyspace 実装とのシグネチャの不一致によるエラーは発生しません。

    2. MathWorks テクニカル サポートに連絡し、コンパイラに関する情報を提供します。

一部の標準ライブラリ関数 (assert など) やメモリ割り当て関数 (malloccalloc など) については、関数を再定義して関数本体を提供した場合でも、Polyspace の独自の実装が引き続き使用されます。詳細は、アサーションまたはメモリ割り当て関数に関連する Polyspace コンパイル警告の修正を参照してください。