Fortify报告了下面代码中的缓冲区溢出漏洞,理由如下 -
在这种情况下,我们主要关注“取决于在代码的直接范围之外执行的数据属性”,因为我们无法验证abc.cpp中memcpy()执行的操作的安全性。
我认为这是一个误报,因为我们首先获取数据的大小,然后分配相应的空间,接着调用memcpy函数进行复制。但是我正在寻找说服其他开发人员放弃当前实现,改用C++字符串的好理由。这个问题已经交给他了。他只是认为这是一个误报,所以不想改变任何东西。
编辑:我看到了对当前代码的快速有效批评。希望现在我能说服他。否则,我将接过这个问题。
在这种情况下,我们主要关注“取决于在代码的直接范围之外执行的数据属性”,因为我们无法验证abc.cpp中memcpy()执行的操作的安全性。
void create_dir(const char *sys_tmp_dir, const char *base_name,
size_t base_name_len)
{
char *tmp_dir;
size_t sys_tmp_dir_len;
sys_tmp_dir_len = strlen(sys_tmp_dir);
tmp_dir = (char*) malloc(sys_tmp_dir_len + 1 + base_name_len + 1);
if(NULL == tmp_dir)
return;
memcpy(tmp_dir, sys_tmp_dir, sys_tmp_dir_len);
tmp_dir[sys_tmp_dir_len] = FN_LIBCHAR;
memcpy(tmp_dir + sys_tmp_dir_len + 1, base_name, base_name_len);
tmp_dir[sys_tmp_dir_len + base_name_len + 1] = '\0';
..........
..........
}
我认为这是一个误报,因为我们首先获取数据的大小,然后分配相应的空间,接着调用memcpy函数进行复制。但是我正在寻找说服其他开发人员放弃当前实现,改用C++字符串的好理由。这个问题已经交给他了。他只是认为这是一个误报,所以不想改变任何东西。
编辑:我看到了对当前代码的快速有效批评。希望现在我能说服他。否则,我将接过这个问题。
base_name_len
的真实性。正如它所说,这在此代码范围内没有得到执行。使用更明智的东西,比如std::string
就可以解决这个问题。 - Mike Seymourbase_name
不是以空字符结尾的字符串,否则您可以使用memcpy(tmp_dir + sys_tmp_dir_len + 1, base_name, base_name_len + 1);
,这样memcpy()
就会在字符串末尾添加空字符。如果base_name
不准确或不是以空字符结尾的字符串,则您现有的代码更安全。如果您检查了malloc()
的结果,我认为不存在缓冲区溢出的问题,但如果您认为无法信任传递的字符串,则应该检查它们是否为空。否则,您无法以可靠、可移植的方式检查它们的有效性。 - Jonathan Lefflerstd::string
一行代码替换它,在此过程中使其具有异常安全性,并且你知道它将消除工具中的误报 - 你还需要更多理由吗?如果你想使用C语言,可以使用asprintf()
函数来满足你的可移植性需求...简洁的代码可以隐藏更少的错误并减少不必要的逻辑混淆。 - Tony Delroybase_name_len
的评论,Adriano Repetti对信任sys_tmp_dir
的评论以及Matt对malloc
失败的评论)。 - MSalters