我正在尝试测试fwrite。我正在尝试编写一个fwrite失败的用例。这是我试过的。
#include <stdio.h>
#include <errno.h>
int main()
{
char arr[6] = "manty";
int ret;
FILE *fp;
printf("Before fwrite - errno - %d\n", errno);
// fp = fopen("fwrite_test.txt", "w+");
ret = fwrite(arr, sizeof(arr) + 2, 1, fp);
printf ("ret - %d errno - %d ferror - %d\n", ret, errno, ferror(fp));
return 0;
}
通过想要评论fopen()我认为fwrite会返回错误。但它给出了分段错误。
如何测试fwrite()?
答案 0 :(得分:3)
此处未初始化的变量fp
会导致undefined behavior,在您的情况下会导致崩溃,因为您正在尝试写入超出流程范围的内存。< / p>
为了编写fwrite
的测试用例,您需要避免可能导致未定义行为的情况,例如leeduhem列出的这种情况和一些情况,然后根据需要传递参数测试他们。
答案 1 :(得分:2)
fwrite(3)有时可能会调用write(2)系统调用,但并非总是如此,因为stdio(3)已缓存(有关详情,请参阅setvbuf(3))。如果fwrite
失败,write
将失败。
您可以使用RLIMIT_FSIZE
限制文件大小setrlimit(2)(并安装或忽略SIGXFSZ
signal(7)处理程序。特别是使用ulimit
内置的bash
shell。然后你可以fwrite
一个足够大的数据缓冲区(大于限制)。您还可以在文件系统上设置配额(请参阅quotactl(2),quotaon(8)等...)然后写入配额限制。最后,您可以在一个高于其容量的小文件系统中编写(参见losetup(8)的示例部分,以创建一个小型文件系统......)。在所有这些情况下,write
都会失败(因此fwrite
也会失败。)
答案 2 :(得分:1)
我认为为fwrite()
的权利而不是为它的错误编写测试用例要容易得多,因为许多可能导致fwrite()
失败的条件,例如未初始化的输入缓冲区,写入比输入缓冲区实际拥有的数据更多,未初始化的文件流将导致根据C标准的未定义行为。
因此,在这些情况下,很难说您是在测试fwrite()
还是在特定测试环境中探索这些未定义行为的实际行为。