警告 C28750
lstrlen 及其變體的禁用用法:'*function-name' 是禁用 API,用於改善錯誤處理目的。
這個警告表示正在使用已禁用的函式,且具有更強固或更安全的取代。 這個特定錯誤表示 lstrlen 或其變體的使用方式。
備註
lstrlen 函式及其變體是禁用的,因為它們無法傳輸例外狀況。 這可能會導致錯誤狀況在稍後發生,可能在不同的線程上發生。 這會使錯誤狀況難以診斷。 此外,對等的替代函式可由編譯程序優化,並避免例外狀況處理程式 (__try和__except區塊) 的效能額外負荷。
正確的緩和措施是使用更安全的字串長度函式 (通常是 strlen、wcslen、_tcslen) 。 不過,當您檢閱 lstrlen 變更時,您應該確認字串緩衝區來自受信任的程序代碼。 如果您正在處理不受信任的數據,您應該改為從 strlen 系列的函式切換至 strnlen 系列 (或 StringCchLength 系列) ,以確保它們不會超過不受信任的數據區塊界限。
請注意,不同於 lstrlen,任何取代專案都不會攔截例外狀況。 此外,lstrlen 會在取代時處理 NULL 指標,因此在將 lstrlen 取代為 strlen 或 strn (len 時,如果程式代碼) 中的 NULL 指標可能的話,則需要明確的 NULL 檢查。
您可以在下列範例之後找到此錯誤涵蓋的所有禁用函式清單,以及信任和不受信任數據 (的建議取代) 。
程式代碼分析名稱:BANNED_API_USAGE_LSTRLEN
範例
下列程式代碼會產生此警告:
int example_func(char* in)
{
int size = lstrlen(in);
return size;
}
這是因為使用 unsafe 函式 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 |