9

Neither g++ (4.4 and 4.6) nor clang++ (3.2) nor coverity, with -Wall and -Wextra (+ some others) or -Weverything respectively gives me a warning for the following code snippet:

class B {
    char *t2;
    char *t;

public:
    B() : t2(t), t(new char[100]) {}
};

I would at least expect a small warning about the usage of uninitialized (member-) variables.

Is there something I'm missing? Is this a wanted "no-warning"-scenario. I have (now had) at least one bug in my software which was hard to find.

EDIT: As can be read in this new question I realized that coverity warns about this problem in some cases.

4

2 に答える 2

6

ここで警告を出さない正当な理由はありません。

G++ は、コンストラクターで初期化されていないメンバーを診断するほどスマートではありません。http://gcc.gnu.org/PR2972 を参照してください。

私はそれを修正するための進行中のパッチを持っており、「今年中に」完了したいと考えています

私のパッチでも、G++ が初期化されているため、警告するかどうかはわかりませんt2 、不確定な値に初期化されています。コンパイラがそれを追跡するのは些細なことではありませんが、可能なはずです (だから、Coverity でさえそれを見逃すことに驚いています) valgrind

パッチを再検討するときは、このケースを検討し、オーバーヘッドをあまり追加せずに警告できるかどうかを確認します (現在、私のパッチは、初期化子のないメンバーがデータを初期化しないままにするかどうかをチェックします。これをキャッチするには、メンバーもチェックする必要があります)初期化子を使用して、その初期化子がまだ初期化されていない別のメンバーに依存しているかどうかを確認します。これは、メンバーごとに確認する必要があり、多数のメンバーを持つクラスのコンパイル速度に影響を与える可能性があります。)

于 2013-01-03T15:57:09.593 に答える
3

C++ 標準によると、初期化されていない変数を使用すると、未定義の動作が発生します。コンパイラがそれに関する診断を発行することを強制するものではありません。したがって、警告を受け取るかどうかは、QOI (実装の品質) の問題です。

于 2013-01-03T12:57:03.450 に答える