CXX.OVERWRITE_CONST_CHAR

尝试覆盖常数字符串

每当将字符串文本分配给指向非常数字符变量的指针时,在修改常数字符串的值之前,应验证其常数性,因为不能对包含字符串文本的内存进行部分修改或全部修改。

CXX.OVERWRITE_CONST_CHAR 检查器会标记尝试修改字符串文本的代码,其中该字符串已分配给指向非常数字符变量的指针。

漏洞与风险

修改字符串文字属于未定义的行为。这可能会导致访问冲突错误,因为此内容通常存储在只读内存中。

缓解与预防

防止出现此缺陷最简单的方法是将字符串文本复制到非常数内存中(无论是位于堆栈上还是堆上),然后修改非常数副本。

漏洞代码示例

复制
   #include <string.h>
    
   int var (int);
    
   int var (int isKnown)
   {
       unsigned char * obj = "";  
       if (isKnown) 
       {
          strcpy(obj, "known"); 
          // Writing over read-only string 
      }
      else 
      {
          strcpy(obj, "unknown"); 
      }
      return 0;
  }

在此示例中,obj 是 char 类型变量的指针,为其分配了 ""(常数类型的字符串)。然后,我们尝试将另一个字符串复制到 obj 变量,这可能会导致访问冲突错误。Klocwork 在第 10 行和第 15 行报告了 CXX.OVERWRITE_CONST_CHAR 缺陷,指出“尝试覆盖字符串文本”。

修正代码示例

复制
   #include <string.h>
    
   int var (int);
    
   int var (int isKnown)
   {
       unsigned char obj[10] = "";  
       if (isKnown) 
       {
          strcpy(obj, "known"); 
          // Now writing over non-const string 
      }
      else 
      {
          strcpy(obj, "unknown"); 
      }
      return 0;
  }

在修正代码示例中,obj 变成了字符数组,第 7 行上的赋值是空字符串文本到数组内存的副本。在第 10 行或第 15 行上进行修改时,实际的修改其实是在非常数内存上进行。

相关检查器

  • CERT.STR.ASSIGN.CONST_TO_NONCONST