传递空指针到 fwrite 会导致问题吗?



我最近写了一些代码,在某些情况下,可能会将 Nullpointer 传递给 fwrite

虽然它可以在Windows上运行,但我想知道它是否可能会在其他平台上引起问题,或者是否有任何阻止它的东西。


我是如何产生如此混乱;):

std::vector<unsigned char> bytes;
// ...
// bytes could be filled but may be empty.
const char* bytesToWrite = (const char*) bytes.data();   // .data() will return NULL if empty
unsigned long count = bytes.size();
if (count == fwrite(bytesToWrite, 1, count, handle)) //...

来自Microsoft文档:

fwrite 返回实际写入的完整项目数,如果发生错误,该数可能小于计数。此外,如果发生错误,则无法确定文件位置指示器。如果流或缓冲区是空指针,或者在 Unicode 模式下指定了要写入的奇数字节数,则该函数将调用无效的参数处理程序,如参数验证中所述。如果允许继续执行,此函数将 errno 设置为 EINVAL 并返回 0。

所以它在 Windows 中工作(好吧,你得到一个明确的错误而不是一个响亮的崩溃,但它仍然不是很有用)。但是在Unix/Linux中没有这种情况的痕迹,所以不要依赖它。始终事先测试:

if (buffer != NULL) { fwrite(buffer, ...

或者使用assert(buffer != NULL)将未定义的行为转换为定义的行为

如果您添加额外的 if 以检查 ptr NULL,则只会降低性能。

NULL传递给fwrite是未定义的行为,在最好的情况下可能会导致分段错误。

将您的代码更改为以下内容:

const char* bytesToWrite = (const char*) bytes.data();   
if(bytesToWrite != NULL)
{
    unsigned long count = bytes.size();
    if (count == fwrite(bytesToWrite, 1, count, handle)) //...
}

最新更新