Joe Buck <[EMAIL PROTECTED]> writes:

| 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.
I would like the compiler to warn for case 1 when the copy-constructor
is inline, along with cases like

     int i = 2 * i;

There are comparable, relatively simple cases that the compiler can
warn about without requiring optimization be turned on.

-- Gaby

Reply via email to