我正在使用以下内容读取文件:
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 bails out的行会抛出错误:
Untrusted value as argument (TAINTED_SCALAR)
tainted_data: Passing tainted variable > s.size() + 1UL to a tainted sink.
我知道我不能信任从文件中读取的任何数据,但我看不到在这个阶段如何验证数据。我已经在错误行上方的- 子句中检查它s.size()
是否在合理的(尽管相当大)范围内。if
那么,为什么 Coverity 会向我发出警告呢?
另外,我应该应用哪些其他输入验证策略?