まれに発生する生存環境の問題を解決するためのコードレビューを行っています。デバッグ環境では再現できないため、唯一の調査手段は、生存環境からのコアダンプとコード解析です。
コアダンプ:ここでの状況をまとめたものである私は、これらのコンストラクタの両方を考える文字列クラスに関するコアダンプの問題に関するヘルプ
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
}
:
(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()
は、コード、STD :: Stringクラス上のようなものをラッパークラスを持っています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をチェックしていますか?内部的にはNULLにUBが表示されるstrlen()が呼び出されるからです。有効なのconstのchar *が渡されている場合以外NULLチェックから はどのようにして確認できますか?
これの背後にあるアイデアは、決してnullポインタ:-)を渡したことのない私が、チェックからパフォーマンスペナルティを得るべきではないということです。あなたはそれを誰にも課すことはできません。ちょうど新しい初心者を救うためです。チェックが必要な場合は、コンストラクタを呼び出すときに自分で追加することができます。 –
は好奇心のために、私はコアの全体1時間の会議の講演会が先週ダンプんでした:http://bit.ly/hPCmVW – Crashworks
@Bo Perssonの:確かに、あなたはチェックは、デバッグ専用の主張、またはあること作ることができますNULLポインターなどを渡す人を殺すだけです。重要なことは、ダンプを見て、これが本当に問題であることを確かめることです。 (正直言って、私のチームの公式パフ・ナチのように言いますが、その場合にNULLチェックをするのは、RISCチップでも最小限です。ブランチレス条件付き移動として行うことができるからです)。 – Crashworks