C 测试用例失败fwrite()

C 测试用例失败fwrite(),c,linux,fwrite,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("fwri

我正试着测试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;
}
#包括
#包括
int main()
{
字符arr[6]=“manty”;
int ret;
文件*fp;
printf(“写入前-错误号-%d\n”,错误号);
//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));
返回0;
}
通过随意注释fopen(),我认为fwrite将返回一个错误。但它给出了一个分段错误


如何测试fwrite()?

此处未初始化的变量
fp
会导致,在您的情况下,这会导致崩溃,因为您试图在进程范围之外的内存上写入


为了编写
fwrite
的测试用例,您需要避免可能导致未定义行为的情况,如本例和中列出的一些,然后按照您希望的方式传递参数

此处未初始化的变量
fp
会导致,在您的情况下,这会导致崩溃,因为您试图在进程范围之外的内存上写入


为了编写
fwrite
的测试用例,您需要避免可能导致未定义行为的情况,如本例和中列出的一些,然后按照您希望的方式传递参数

我相信为
fwrite()
的正确性编写测试用例要容易得多,而不是为它的错误编写测试用例,因为许多可能导致
fwrite()
失败的条件,例如未初始化的输入缓冲区,写入的数据比输入缓冲区实际拥有的数据多,未初始化的文件流,根据C标准,将导致未定义的行为


因此,在这种情况下,很难说您是在测试
fwrite()
,还是在您特定的测试环境中探索这些未定义行为的实际行为。

我相信为
fwrite()
的正确性编写测试用例要比为它的错误编写测试用例容易得多,由于许多可能导致
fwrite()
失败的情况,例如未初始化的输入缓冲区,写入的数据比输入缓冲区实际拥有的数据多,未初始化的文件流,将导致根据C标准的未定义行为

因此,在这些情况下,很难说您是在测试
fwrite()
,还是在特定测试环境中探索这些未定义行为的实际行为。

有时可能会调用系统调用,但并不总是,因为它是缓冲的(有关更多信息,请参阅)。如果写入失败,
fwrite
将失败

您可以使用
RLIMIT_FSIZE
限制文件大小(并安装或忽略
SIGXFSZ
处理程序)。特别是通过使用
bash
shell的
ulimit
builtin。然后,您可以写入足够大的数据缓冲区(大于限制)。您还可以在文件系统上设置配额(请参阅等),然后写入配额限制。最后,您可以在一个超过其容量的小文件系统中进行编写(请参阅的“创建一个小文件系统的步骤”的示例部分…)。在所有这些情况下,
write
都会失败(因此
fwrite
也会失败)。

有时可能会调用系统调用,但并不总是这样,因为它是缓冲的(有关更多信息,请参阅)。如果写入失败,
fwrite
将失败


您可以使用
RLIMIT_FSIZE
限制文件大小(并安装或忽略
SIGXFSZ
处理程序)。特别是通过使用
bash
shell的
ulimit
builtin。然后,您可以写入足够大的数据缓冲区(大于限制)。您还可以在文件系统上设置配额(请参阅等),然后写入配额限制。最后,您可以在一个超过其容量的小文件系统中进行编写(请参阅的“创建一个小文件系统的步骤”的示例部分…)。在所有这些情况下,
write
都会失败(因此,
fwrite
也会失败)。

似乎编写
fwrite()
正确性的测试用例非常容易。编写
fwrite()
正确性的测试用例非常容易。