☰
  • 首页
  • 规则分类
  • 项目介绍
search
•••

指针不应与字符串常量直接比较

10.5.3 ID_illPtrStrComparison
目录 › next › previous

直接比较指针和字符串常量的结果往往总是 false,应改用字符串比较函数。

示例:

bool is_name(const char* p) {
    return p == "bar";          // Non-compliant
}

如果例中 is_name 函数只接受常量字符串作为参数,该函数在某些环境中也可能正常工作,如:

if (is_name("foo")) {   // May be false
    ....
}
if (is_name("bar")) {   // May be true
    ....
}

然而相同的字符串常量是否一定拥有相同的地址呢?对这个问题不同的编译器有不同的实现,有可移植性要求的代码要规避这种问题,而且这种问题极易导致错误,一般的程序都应该避免这种问题。

应改为:

bool is_name(const char* p) {
    return !strcmp(p, "bar");   // Compliant
}

依据

ISO/IEC 9899:1999 6.4.5(6)-unspecified ISO/IEC 9899:2011 6.4.5(7)-unspecified ISO/IEC 14882:2003 2.13.4(2)-implementation ISO/IEC 14882:2011 2.14.5(12)-implementation ISO/IEC 14882:2017 5.13.5(16)-unspecified

参考

CWE-595 CWE-697 CWE-1024 CWE-1025
Copyright©2024 360 Security Technology Inc., Licensed under the Apache-2.0 license.