On Thu, Jan 11, 2007 at 04:09:16AM +0100, Gabriel Dos Reis wrote: > The subtlety I'm refering to is not that "void* p = &p" is not well-defined, > but rather the fact that when we see > > T t = some-expression-involving-t; > > we would like to warn for cases where there is a high probability that > the *initialization* of "t" *results in undefined behaviour*, as opposed > to leaving "t" undefined. -Wunintialized was not designed to handle > those cases. That matter is compounded by the fact that > some constructs such as > > circular_buffer buf = buf; > > are well-formed and not attempt to work around agreed deficiency of > -Wunitialized. To do that, it is not clear -- without seeing the body > of the copy constructor -- whether only the address is used or not.
There are three cases: either you can be certain that an uninitialized value will be used, or you can be certain that it won't be used, or you don't know because you don't see the body of the copy constructor. Case 1: int i = i; or SomeClass p = p; // compiler-generated copy constructor Case 2: void* p = &p; Case 3: SomeClass p = p; // user-defined copy constructor, can't see the body Case 2 is completely valid. In Case 1 we have uninitialized variables. In Case 3 we cannot tell. There's an argument for not warning in case 3, though unfortunately in my early days of C++ programming I often managed to make mistakes similar to this, and the compiler would not warn.