我在文件操作功能中运行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");
任何帮助都将受到高度赞赏。
答案 0 :(得分:4)
尝试以下方法:
char* id_str = getenv("ID");
if (id_str) {
id_str = strdup(id_str);
id = atoi(id_str);
free( id_str );
}
传递给fopen的fn
字符串被环境变量污染。使用strdup可以充当“消毒”。
答案 1 :(得分:4)
Error:TAINTED_STRING
警告(就Coverity而言)行为的某些方面受到某些外部输入的影响,并且在影响执行之前不会检查外部输入的“安全性”。
在这个特定的例子中,看起来Coverity是错误的,因为LOG_FILE的值是“/log/test%d.log”,并且与int
中的snprintf
一起使用,这意味着char fn[100]
的内容总是很明确。
因此,合理的做法是将错误标记为非问题,以便在将来的运行中将其忽略。
答案 2 :(得分:1)
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正在查找的行
希望这会有所帮助。