Запятнанная строка в C
Я использую инструмент Coverity в своей файловой функции и получаю следующую ошибку.
Как вы можете видеть ниже, я использую snprintf() перед передачей этой переменной в номер строки, показанный в сообщении об ошибке. Я предполагаю, что некоторая дезинфекция строки должна быть выполнена как часть этого snprintf(). Но все равно предупреждение отображается.
Error:TAINTED_STRING (TAINTED string "fn" was passed to a tainted string sink content.) [coverity]
char fn[100]; int id = 0;
char* id_str = getenv("ID");
if (id_str) {
id = atoi(id_str);
}
memset(fn, '\0', sizeof(fn));
snprintf(fn, 100, LOG_FILE, id);
if(fn[100-1] != '\0') {
fn[100-1] = '\0';
}
log_fp = fopen (fn, "a");
Любая помощь будет высоко оценен.
2 ответа
Попробуйте следующее:
char* id_str = getenv("ID");
if (id_str) {
id_str = strdup(id_str);
id = atoi(id_str);
free( id_str );
}
fn
Строка, переданная в fopen, испорчена переменной окружения. Использование strdup может действовать как "дезинфекция".
Error:TAINTED_STRING
предупреждает, что (насколько может сказать Coverity) некоторый аспект поведения подвержен влиянию какого-либо внешнего входа и что внешний вход не проверяется на "безопасность" до того, как он повлияет на выполнение.
В этом конкретном примере может показаться, что Coverity является неправильным, поскольку значение LOG_FILE равно "/log/test%d.log" и используется с int
в snprintf
Это означает, что содержание char fn[100]
всегда хорошо определен.
Таким образом, разумным шагом будет пометить ошибку как не являющуюся проблемой, чтобы она игнорировалась при последующих запусках.
Coverity хочет убедиться, что вы дезинфицируете любую строку, поступающую извне вашей программы, будь то getenv, argv или прочитанный файл.
У вас может быть функция для очистки ввода (испорченная строка) и комментарий от Coverty, который сообщает Coverty, что строка ввода очищена и предупреждение SA исчезнет.
// coverity[ +tainted_string_sanitize_content : arg-0 ]
int sanitize_mystring(char* s)
{
// Do some string validation
if validated()
return SUCCESS;
else
return FAILED;
}
// coverity[+tainted_string_sanitize_content: arg-0] - строка, которую ищет Коверти
Надеюсь это поможет.