我在文件操作功能中运行 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");
任何帮助将不胜感激。
编辑: 正如OP在评论中提到的,
LOG_FILE
定义为"/log/test%d.log"
。
尝试以下操作:
char* id_str = getenv("ID");
if (id_str) {
id_str = strdup(id_str);
id = atoi(id_str);
free( id_str );
}
传递给 fopen 的
fn
字符串被环境变量污染。使用 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 ] 是 Coverty 正在查找的行
希望这有帮助。