警告 C28750
lstrlen とそのバリアントの使用が禁止されている: '*function-name' は、エラー処理を改善する目的のために禁止されている API です。
この警告は、禁止になっている関数が使用されており、より堅牢または安全な代替関数があることを示します。 この特定のエラーは、lstrlen またはそのバリアントの使用を示します。
解説
lstrlen 関数とそのバリアントは、例外の送信に失敗するため禁止されています。 これにより、エラー状態がかなり後で、別のスレッドで発生する可能性があります。 このため、エラー状態の診断が困難になります。 さらに、同等の代替関数がコンパイラで最適化できるため、例外ハンドラー (__try ブロックと __except ブロック) のパフォーマンス オーバーヘッドを回避できます。
適切な軽減策は、より安全な文字列長の関数 (通常は strlen、wcslen、_tcslen) を使用することです。 ただし、lstrlen の変更の確認時は、文字列バッファーが信頼できるコードから取得されていることを確認する必要があります。 信頼されていないデータを処理する場合は、代わりに strlen 関数ファミリから strnlen ファミリ (または StringCchLength ファミリ) に切り替える必要があります。これにより、信頼されていないデータ ブロックの境界を超えなくなります。
lstrlen とは異なり、どの代替関数も例外をキャッチしません。 また、lstrlen は NULL ポインターを処理しますが、代替関数は処理しないので、lstrlen を strlen または strnlen に置き換える場合は、明示的な NULL チェックが必要です (コード内のその時点で NULL ポインターが可能な場合)。
このエラーの対象となるすべての禁止されている関数と推奨される置き換え (信頼されたデータと信頼されていないデータの両方) の一覧は、次の例の後にあります。
コード分析名: BANNED_API_USAGE_LSTRLEN
例
この警告が発生するコード例を次に示します。
int example_func(char* in)
{
int size = lstrlen(in);
return size;
}
これは安全でない関数 lstrlen を使用しているためです。 この問題を解決するには、代替関数として strlen を使用し、ポインターが NULL の場合は必ずチェックします。
int example_func(char* in)
{
if (in != NULL) {
int size = strlen(in);
return size;
}
else {
// handle error.
}
}
禁止されている関数
禁止されている API | 信頼できるデータの置換 | 信頼できないデータの置換 |
---|---|---|
lstrlen |
_tcslen |
_tcsnlen , StringCchLength |
lstrlenA |
strlen |
strnlen , StringCchLengthA |
lstrlenW |
wcslen |
wcsnlen , StringCchLengthW |