C中的污点字符串
我正在我的文件操作function中运行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");
任何帮助将受到高度赞赏。
请尝试以下方法:
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”并且与snprintf
的int
一起使用,这意味着char fn[100]
内容总是很好定义。
因此,合理的行动方案是将错误标记为非问题,以便在将来的运行中忽略它。