警告 C28750
禁止使用 lstrlen 及其变体:“*function-name”是一个禁止的 API,用于改进错误处理。
此警告表明正在使用的函数已被禁止,并且具有更可靠或更安全的替换。 此特定错误指示使用 lstrlen 或其变体。
注解
禁止 lstrlen 函数及其变体,因为它们无法传输异常。 这可能会导致错误条件在以后发生,可能在不同的线程上发生。 这使得错误条件更难诊断。 此外,编译器可以优化等效的替换函数,并避免异常处理程序 (__try 和__except块) 的性能开销。
正确的缓解措施是使用更安全的字符串长度函数 (通常为 strlen、wcslen _tcslen) 。 但是,在查看 lstrlen 更改时,应确认字符串缓冲区来自受信任的代码。 如果要处理不受信任的数据,应改为从 strlen 系列函数切换到 strnlen 系列 (或 StringCchLength 系列) ,这将确保它们不会超过不受信任的数据块的边界。
请注意,与 lstrlen 不同,任何替换项都不会捕获异常。 此外,lstrlen 处理 NULL 指针,而替换则不处理,因此在代码) 中将 lstrlen 替换为 strlen 或 strnlen 时,需要显式 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 |