Я выполняю проверку кода для решения редко встречающейся проблемы с живым окружением. Он не воспроизводится в средах отладки и, следовательно, единственным средством исследования является дамп ядра из оперативной среды и посредством анализа кода. Вот краткое изложение ситуации:
Основной дамп:
(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, что-то вроде:
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 () для определения длины, произойдет Undefined Behavior (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 *? (NOn NULL прекращается const char * и т. Д.)