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