2014-03-06 180 views
0

我想测试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将返回一个错误。但它给出了分段错误。

如何cani测试fwrite()?

+0

看起来像''fwrite()'的正确性的测试用例很容易编写。 –

回答

2

fwrite(3)有时调用系统调用write(2),但并非总是如此,因为stdio(3)缓存(见setvbuf(3)更多)。如果write失败,fwrite将失败。

你可以限制文件大小setrlimit(2)RLIMIT_FSIZE(安装或忽略SIGXFSZ​​处理)。特别是通过使用bash shell的ulimit内建。那么你可以使用足够大的数据缓冲区(大于限制)。您还可以在文件系统上设置配额(请参阅quotactl(2),quotaon(8)等),然后写入配额限制。最后,你可以写在一个小容量的文件系统上面(参见示例losetup(8)的一部分来创建一个小文件系统......)。在所有这些情况下,write都会失败(所以fwrite也是如此)。

3

您的未初始化变量fp这里的结果是undefinedbehavior,在您的情况下,由于您试图在超出过程范围的内存上写入,导致崩溃。

为了编写测试用例fwrite你需要避免可能导致未定义的行为的情况下,像这样的一些由leeduhem列出,然后为您希望测试他们通过你的参数。

1

我认为这是很容易写测试用例为fwrite(),而不是为它的falures的rightnecss,因为许多可能导致fwrite()条件失败,比如未初始化的输入缓冲器,写更多的数据比输入缓冲区实际上具有未初始化的文件流将导致根据C标准的未定义行为。

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