CXX.STDLIB.ILLEGAL_REUSE

CXX.STDLIB.ILLEGAL_REUSE チェッカーは、asctime()、ctime()、gmtime()、localtime()、localeconv()、getenv()、setlocale()、または strerror() を呼び出すことで返されたポインターをコードが変更しようとすると、欠陥を報告します。

脆弱性とリスク

上記の関数の 2 回目の呼び出しで、ポイントされたオブジェクトが、返されたポインターで上書きされる可能性があります。

軽減と防止

後で安全に参照する場合は、2 回目の呼び出しを行う前に、文字列をコピーしてバッファに常に保存します。

脆弱コード例

コピー
  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 */
 }

この例では、getenv() の後続の呼び出しが行われるときに temp1 が上書きされる可能性があるため、Klocwork は 7 行目と 9 行目で欠陥を報告します。

修正コード例

コピー
   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