我最近编写了一些代码,在某些情况下,可能会将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)) //...
答案 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)) //...
}