Я читаю файл, используя что-то вроде:вход проверки с стандом :: ifstream
std::ifstream is(file_name);
std::string s;
if(!is.good()) {
std::cout << "error opening file: " << file_name << std::endl;
} else {
while(!is.eof()) {
s.clear();
is >> s;
if (s.empty()) continue;
if (s.size() < 1 || s.size()>0x7FFFFFFF) {
std::cout << "implausible data" << std::endl;
continue;
}
char *ss = new char[ s.size() + 1 ]; // COVERITY bails out
// do something with the data
delete[]ss;
}
}
Когда я анализирую выше код с статическим анализом кода инструментом coverity (бесплатная версия), линия отмечена Coverity вываливается выдает ошибку:
Untrusted value as argument (TAINTED_SCALAR)
tainted_data: Passing tainted variable > s.size() + 1UL to a tainted sink.
Я понимаю, что я не должен доверять какие-либо данные, считанные из файла, но я не могу понять, как проверить данные на данном этапе. Я уже проверяю, что s.size()
находится в пределах правдоподобного (хотя и довольно большого) диапазона в if
-clause над ошибочной линией.
Так почему же обложка бросает предупреждение на меня?
Кроме того, какие другие стратегии для проверки ввода должны применяться?
На самом деле не стоит называть 'eof()'. http://stackoverflow.com/questions/5605125/why-is-iostreameof-inside-a-loop-condition-considered-wrong – Galik
Вместо проверки 's.empty()' лучше проверить, удалось ли прочитать: 'while (is >> s) {/ * чтение s преуспело здесь */...}' – Galik
Возможно, анализатор кода не справляется с пониманием того, что 's.size()' вернет одинаковое значение для всех трех вызовов. Вы пытались присвоить возвращаемое значение переменной и использовать ее? – 5gon12eder