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