测试用例失败fwrite()

时间:2014-03-06 03:01:07

标签: c linux fwrite

我正在尝试测试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()?

3 个答案:

答案 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()还是在特定测试环境中探索这些未定义行为的实际行为。