6

我在我的文件操作函数中运行 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");

任何帮助将不胜感激。

4

3 回答 3

4

Error:TAINTED_STRING警告说(据 Coverity 所知)行为的某些方面受到某些外部输入的影响,并且在影响执行之前不会检查外部输入的“安全性”。

在这个特定的示例中,Coverity 似乎是错误的,因为 LOG_FILE 的值是“/log/test%d.log”,并且与 中的 anint一起使用snprintf,这意味着 的内容char fn[100]始终是明确定义的。

因此,合理的做法是将错误标记为非问题,以便在以后的运行中将其忽略。

于 2014-09-11T10:11:24.677 回答
4

尝试以下操作:

char* id_str = getenv("ID");
if (id_str) {
   id_str = strdup(id_str);
   id = atoi(id_str);
   free( id_str );
}

传递给 fopen的fn字符串被环境变量污染。使用 strdup 可以起到“消毒”的作用。

于 2014-02-11T14:41:58.613 回答
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 正在查找的行

希望这可以帮助。

于 2020-02-06T19:56:23.557 回答