有没有g ++选项可以使用NULL const char *检测std :: string的不正确初始化?
我正在将一些int字段转换为std :: string,即:
struct Foo
{
int id;
Foo() : id(0) {}
};
......变成了:
struct Foo
{
std::string id;
Foo() : id(0) {} //oooops!
};
我完全忽略了错误的'id'初始化0和g ++没有给我任何警告。在运行时检测到此错误(std :: string构造函数抛出异常),但我真的想在编译时检测到这些东西。有什么办法吗?
答案 0 :(得分:7)
我想不出在编译时检测这个的方法,所以我编写了一个字符串构建器函数来正确处理空指针:
// FUNCTION : safe_string(char const* pszS)
// PARAMATERS : pszS source string to build a string from (may be NULL or 0-length)
// DESCRIPTION : Safely builds a string object from a char*, even a NULL pointer
// RETURNS : string
template<class C>
inline basic_string<C> safe_string(const C* input)
{
if( !input )
return basic_string<C>();
return basic_string<C>(input);
}
每当我创建一个字符串时我就会使用它,并且输入可能是NULL。
答案 1 :(得分:5)
我认为它实际上是未定义的行为,并且未经编译器检查。你很幸运,这个实现会引发异常。
但是,您可以通过以类型无关的方式指定要进行默认或零初始化来避免此类问题:
struct Foo
{
X id;
Foo() : id() {} //note empty parenthesis
};
答案 2 :(得分:2)
GCC中有基础设施可以产生这种警告:
void foo(const char* cstr) __attribute__((nonnull (1)));
void bar() {
foo(0);
}
使用-Wnonnull
编译时(由-Wall
暗示)产生:
warning: null argument where non-null required (argument 1)
所以原则上你应该能够修改相关的系统标题(或者,更好地进行实验,修改你自己的$ HOME / bits / basic_string.h副本,然后用-isystem $HOME
覆盖系统标题) :
basic_string(const _CharT* __s, const _Alloc& __a = _Alloc())
__attribute__((nonnull (1)));
然而这没有用,因为(至少在4.0.1中){+ 1}}在C ++中不受支持,并且该属性显然被忽略了。为什么会这样,这一点并不明显;也许有人觉得它与超载或其他东西的关系很糟糕。