標準関数が不適切な引数で呼び出されました
標準関数の引数がその関数における使用の要件を満たさない
説明
この欠陥は、特定の標準関数の引数が、その関数における使用の要件を満たしていない場合に発生します。
たとえば、こうした関数の引数は次のような形で無効になることがあります。
| 関数の種類 | 状態 | リスク | 修正方法 |
|---|---|---|---|
strlen や strcpy のような文字列操作関数 | ポインター引数が NULL 終端文字列を指さない。 | 関数の動作が未定義になる。 | NULL 終端文字列を文字列操作関数に渡す。 |
fputc や fread のような、stdio.h 内のファイル処理関数 | FILE* ポインター引数が値 NULL をもつことがある。 | 関数の動作が未定義になる。 | FILE* ポインターを関数の引数として使用する前に、NULL についてテストする。 |
lseek や read のような、unistd.h 内のファイル処理関数 | ファイル記述子の引数が -1 になることがある。 | 関数の動作が未定義になる。 関数 | 関数 戻り値が -1 であれば、 |
| ファイル記述子の引数が、閉じられたファイル記述子を表している。 | 関数の動作が未定義になる。 | ファイル記述子は、その使用が完全に終了してから閉じる。あるいは、ファイル記述子を関数の引数として使用する前に再度開く。 | |
mkdtemp や mkstemps のようなディレクトリ名生成関数 | 文字列テンプレートの最後の 6 文字が XXXXXX でない。 | 関数により、最後の 6 文字が、ファイル名を一意にする文字列で置き換えられる。最後の 6 文字が XXXXXX でない場合、関数は十分な一意性をもつディレクトリ名を生成できない。 | 文字列を関数の引数として使用する前に、その文字列の最後の 6 文字が XXXXXX であるかどうかをテストする。 |
getenv や setenv のような、環境変数に関連した関数 | 文字列引数が "" である。 | 動作が処理系定義になる。 | 文字列引数を getenv や setenv の引数として使用する前に、"" についてテストする。 |
文字列引数が等号 = で終了している。たとえば、"C" ではなく "C=" になっている。 | 動作が処理系定義になる。 | 文字列引数を = で終わりにしない。 | |
strtok や strstr のような文字列処理関数 |
| 実装によっては、こうしたエッジ ケースが扱われない。 | 文字列を関数の引数として使用する前に、"" についてテストする。 |
修正方法
修正方法は欠陥の根本原因によって異なります。上の表に記載されている修正と以下の修正付きのコード例を参照してください。
問題を修正しない場合は、改めてレビューされないように結果またはコードにコメントを追加します。詳細は、以下を参照してください。
Polyspace ユーザー インターフェイスでのバグ修正または正当化による結果への対処 (Polyspace ユーザー インターフェイスで結果をレビューする場合)。
Polyspace Access でのバグ修正または正当化による結果への対処 (Polyspace Access) (Web ブラウザーで結果をレビューする場合)。
コードへの注釈付けと既知の結果または許容可能な結果の非表示 (IDE で結果をレビューする場合)
例
結果情報
| グループ: プログラミング |
| 言語: C | C++ |
| 既定値: 手書きコードはオン、生成コードはオフ |
コマンド ライン構文: STD_FUNC_ARG_MISMATCH |
| 影響度: Medium |
バージョン履歴
R2015b で導入