2010-06-08 121 views
3

在我的代碼中一些地方,我打印調試消息是這樣的:`std :: string(strerror(errno))`危險嗎?

int ret = getLinkSpeed(device.getSysName(), linkSpeed); 
if (ret < 0) 
{ 
    logDebug("Failed to obtain port speed for this device. Error: " + std::string(strerror(errno))); 
} 

documentation它並不完全清楚,如果字符串錯誤在一定條件下返回0(這將導致我的代碼崩潰)。有誰知道它是否安全?

+0

根據其linux手冊頁:「在某些系統上,如果錯誤編號未知,strerror()將返回NULL。」 – 2010-06-08 10:29:05

回答

11

爲什麼不寫一個函數來做到這一點:

string ErrStr() { 
    char * e = strerror(errno); 
    return e ? e : ""; 
} 

這是簡單易用,自我記錄,可適應格式化輸出,並涵蓋於strerror()可能返回NULL(我的可能性不知道是否可以)。

+1

我會返回e?e:「未知錯誤」;至少包含這樣的錯誤描述的消息不會看起來不完整。 – 2010-06-08 14:27:48

3

好問題(+1),文檔看起來很模糊。我不確定是否有「更難」的來源,例如POSIX規範。

有點務實的想法,here是GNU libc的實現。它返回一個指向靜態字符串緩衝區的指針,所以它不能返回0.

迴應p00ya的評論,在面對衝突,模糊或不完整的規範時要做的安全(也是非常實用的,heh)是當然假設最差,並且 而不是假定返回值總是一個有效的字符串。

+0

根據POSIX,在strerror本身有錯誤的情況下,返回值是未定義的(儘管將設置errno)。只按規範去做,我認爲你不能依賴一個可返回的緩衝區(無論它是否爲0)。 – p00ya 2010-06-08 09:01:31

+0

'strerror()'在C標準中定義,它不允許失敗。 – caf 2010-06-08 11:26:25

3

如果您使用多線程應用程序,可能會遇到問題。在這種情況下,您需要使用strerror_r