可以将Nullpointer传递给fwrite导致问题

时间:2017-10-10 09:10:56

标签: c++ 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)) //...

2 个答案:

答案 0 :(得分:2)

来自Microsoft documentation

  

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

所以它适用于Windows(嗯,你得到一个明确的错误,而不是一个大声的崩溃,但它仍然不是很有用)。但是在Unix / Linux中没有这种情况的痕迹,所以不要依赖它。务必事先测试:

<script>
var query1 = $('#edit-contact-1-address-postal-code'); 
var isVisible1 = query1.is(':hidden'); 

if (isVisible1 === true) {
$('#post').hide();
}

</script>

或使用if (buffer != NULL) { fwrite(buffer, ... 将未定义的行为转换为已定义的行为

答案 1 :(得分:1)

如果您添加额外的if来检查NULL ptr,只会有一点性能损失。

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

将您的代码更改为:

const char* bytesToWrite = (const char*) bytes.data();   
if(bytesToWrite != NULL)
{
    unsigned long count = bytes.size();

    if (count == fwrite(bytesToWrite, 1, count, handle)) //...
}