C 中的受污染字符串

问题描述 投票:0回答:3

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

c string coverity
3个回答
4
投票

尝试以下操作:

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

传递给 fopen 的

fn
字符串被环境变量污染。使用 strdup 可能起到“消毒”作用。


4
投票

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

在这个特定示例中,Coverity 似乎是错误的,因为 LOG_FILE 的值为“/log/test%d.log”,并且与

int
中的
snprintf
一起使用,这意味着
char fn[100]
的内容总是有明确的定义。

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


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

希望这有帮助。

© www.soinside.com 2019 - 2024. All rights reserved.