2014-03-06 178 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()還是在您的特定測試環境中探索這些未定義行爲的實際行爲。