我正在執行代碼審覈以解決很少發生的實時環境問題。它在調試環境中不可重現,因此調查的唯一方法是實時環境和代碼分析的核心轉儲。這是形勢的總結:
核心轉儲:關於涉及字符串類的核心轉儲問題的幫助
(gdb) bt
#0 in strlen() from /lib/libc.so.6
#1 in std::basic_string<char, std::char_traits<char>, std::allocator<char> >::basic_string$base() from libstdc++.so.6
#2 in CustomStr::CustomStr()
代碼必須在標準的包裝類:: string類,類似:
class CustomStr: public string
{
//Some custom members here
};
This custom class has constructors:
CustomStr::CustomStr(const char *str):string(str)
{
//Some derived class inits
}
CustomStr::CustomStr(const CustomStr& str) : string(str.c_str())
{
//Some derived class inits
}
我認爲這兩個構造函數有一個問題,如果一個指向NULL的指針被傳遞,同樣的將被傳遞給String構造函數,並且當它在內部調用strlen()來確定長度時會發生未定義行爲(UB)。 我想實現正確的方式將是調用字符串構造像以前一樣,檢查是否有NULL:
CustomStr::CustomStr(const char *str)
{
if(str!= NULL)
string(str);
//Some derived class inits
}
CustomStr::CustomStr(const CustomStr& str)
{
if(str!= NULL)
string(str.c_str());
//Some derived class inits
}
我的問題是:
- 做的問題(我認爲這是)並且提出的解決方案似乎是有效的案例?
- 字符串構造函數檢查NULL嗎?我認爲這應該是因爲它內部調用strlen()將顯示UB NULL。
- 除了NULL檢查一個如何檢查是否有效的爲const char *被傳遞?(非NULL終止爲const char *等)
這背後的想法是,我永遠不會傳遞一個空指針:-),不應該從檢查中得到性能損失。你不能把它強加給每個人,只是爲了節省一些新手。如果你需要檢查,你可以在調用構造函數時自己添加它。 – 2011-03-11 10:23:47
爲了好奇,我在上週做了一個關於核心轉儲的整整一個小時的會議講座:http://bit.ly/hPCmVW – Crashworks 2011-03-11 10:25:31
@Bo Persson:當然,您可以使該檢查成爲僅調試斷言,或者只是激發傳遞NULL指針的人,等等。重要的是看看垃圾場,確定這確實是問題,而不僅僅是假設。 (儘管說實話 - 我說這是我的團隊的官方Perf Nazi - 即使在RISC芯片上,在這種情況下執行NULL檢查的性能懲罰也非常小,因爲您可以將其作爲無分支條件移動在大約三個流水線週期中)。 – Crashworks 2011-03-11 10:27:32