グラムを使用してNULLののconstのchar *に不適切なのstd ::文字列の初期化を回避++
質問
AがSTDの不適切な初期化を検出することができる任意のG ++オプション:: NULLののconstのcharの文字列*?
私はいくつかののstd ::文字列のもの、すなわち内のフィールドをint型回すの過程にありました
struct Foo
{
int id;
Foo() : id(0) {}
};
...になってます:
struct Foo
{
std::string id;
Foo() : id(0) {} //oooops!
};
私は完全に0とすべてで私に何の警告を与えなかっ++グラムと悪い「ID」の初期化を見落とし。このエラーは、実行時に検出された(のstd ::文字列コンストラクタが例外を投げた)が、私は本当に、コンパイル時に、このようなものを検出したいと思います。方法はありますか?
解決
私はそれが実際には、コンパイラによって確認された未定義の動作とはないと思います。あなたは、この実装は例外をスローすることを幸運です。
ただし、種類に依存しない方法であなたは、デフォルトまたはゼロ初期化を望んでいることを指定することにより、このような問題を回避することができます:
struct Foo
{
X id;
Foo() : id() {} //note empty parenthesis
};
他のヒント
私は、コンパイル時にこれを検出するための方法を考えることはできませんので、私は適切にヌルポインタを扱う文字列ビルダ機能を書いてます:
// 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であるかもしれない可能性があります。
正確に警告のこの種を生成するために、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 /ビット/ basic_string.hをコピーして-isystem $HOME
とシステム1を上書き変更し、実験のためのより良いか、)関連するシステムヘッダを変更することができるようにするべき原則でそう>
basic_string(const _CharT* __s, const _Alloc& __a = _Alloc())
__attribute__((nonnull (1)));
(少なくとも4.0.1で)-Wnonnull
は、C ++でサポートされておらず、属性が明らかに無視されているため、しかし、これは役立ちません。これがそうである理由は明らかではありません。おそらくそれは、それが過負荷または何かをひどく相互作用することが感じられました。
所属していません StackOverflow