CXX.STDLIB.ILLEGAL_REUSE
当代码尝试修改通过调用 asctime()、ctime()、gmtime()、localtime()、localeconv()、getenv()、setlocale() 或 strerror() 而返回的指针时,CXX.STDLIB.ILLEGAL_REUSE 检查器会报告缺陷。
漏洞与风险
对上述函数的第二次调用可能会覆盖由返回的指针所指向的对象。
缓解与预防
如果要在稍后安全地引用字符串,那么必须在进行第二次调用之前将字符串复制并存储到缓冲区中。
漏洞代码示例
复制
void func1(void) {
char *temp1;
char *temp2;
temp1 = getenv("TEMP1");
printf("temp1 is %s\n", temp1);
temp2 = getenv("TEMP2");
printf("temp1 is %s\n", temp1); /* REPORT DEFECT HERE */
printf("temp2 is %s\n", temp2);
int v = strcmp(temp1, temp2); /* REPORT DEFECT HERE */
}
在此示例中,Klocwork 在第 7 和 9 行报告了缺陷,因为在对 getenv() 进行后续调用时,temp1 可被覆盖。
修正代码示例
复制
void func2(void) {
char *temp1;
char *temp2;
const char *temp = getenv("TEMP1");
temp1 = (char *)malloc(strlen(temp)+1);
printf("temp1 is %s\n", temp1);
strcpy(temp1, temp);
temp = getenv("TEMP2");
temp2 = (char *)malloc(strlen(temp)+1);
printf("temp1 is %s\n", temp1);
printf("temp2 is %s\n", temp2);
int v = strcmp(temp1, temp2);
}
在修正代码示例中,代码将 getenv() 返回的字符串 temp1 复制到缓冲区中,以便在稍后可以引用副本。
相关检查器
- MISRA.STDLIB.ILLEGAL_REUSE.2012_AMD1