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