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