次の方法で共有


警告 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