C中的污点字符串

时间:2014-02-11 13:55:06

标签: c string coverity

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

任何帮助都将受到高度赞赏。

3 个答案:

答案 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正在查找的行

希望这会有所帮助。