2014-09-24 22 views
0

怎樣纔算最好的做法來處理什麼意思是一個字符串作爲 參數傳遞給函數即不可信的字符指針參數

int use_the_force(const char *dark_side_file_name) { 
    char *safe_force_it_is = Yoda(dark_side_file_name); 
    return useTheForceYouCan(safe_force_it_is); 
} 

假設主叫方達斯·維達,你會尤達做的,以確保當我們在「safe_force_it_is」上使用像strlen/strnlen或memchr之類的東西時,有一個NULL終止符,並且當我們使用我們期望的有效的字符串時,我們不會跑到黑暗的一面?

+2

你幾乎沒有辦法。除非你有一些「最大預期字符串長度」的概念。 – 2014-09-24 08:27:12

+2

這就是說,什麼是(現實的)情況下,這將是一個問題?即如果您處於惡意代碼調用您的代碼的情況,那麼您肯定已經有問題了? – 2014-09-24 08:29:59

回答

5

這是不合理的,採取未知長度的字符串,並試圖找出它是否是空終止。如果不是,你怎麼知道何時停止?

可能有一些瘋狂的,不可移植的想法,但它們都不是一個理智的程序所必需的。你需要知道輸入是以null結尾的,否則你需要知道它的最大長度。

+0

我知道問這是不合理的,「多久是一條繩?」。如果這就是問題的原因,那麼我的措辭很糟糕。對我來說,獲取文件路徑並做malloc(sizeof(char)* strlen(path)+ 1);當我不相信來電者時似乎是蠻幹的。 PATH_MAX有問題,請參閱[PATH_MAX根本不是](http://insanecoding.blogspot.com/2007/11/pathmax-simply-isnt.html)。當我讀到我應該檢查我的輸入,即[API00-C](https://www.securecoding.cert.org/confluence/display/seccode/API00-C.+Functions+should+validate+their+parameters)I我仍然想知道尤達會做什麼? – Harry 2014-09-27 23:04:52

+0

你只需要使用strlen。如果你不能相信你給出的char *甚至是一個以null結尾的字符串,那麼你需要重新設計。 – 2014-09-28 03:39:34