[cfe-dev] False warning in recent clang

John McCall rjmccall at apple.com
Fri Jun 22 11:51:52 PDT 2012


On Jun 22, 2012, at 4:59 AM, James Dennett wrote:
> On Fri, Jun 22, 2012 at 4:30 AM, Konstantin Tokarev <annulen at yandex.ru> wrote:
>> Hi all,
>> 
>> After recent clang update I'm getting new warnings from Qt headers:
>> 
>> /usr/local/Trolltech/Qt-4.8.0/include/QtCore/qsharedpointer_impl.h:595:43: warning: field is uninitialized when used here [-Wuninitialized]
>>    inline QWeakPointer(X *ptr) : d(ptr ? d->getAndRef(ptr) : 0), value(ptr)
>>                                          ^
>> 
>> (caret is pointing at 'd' before '->getAndRef')
>> 
>> Here is complete piece of subject code:
>> 
>> template <class X>
>> inline QWeakPointer(X *ptr) : d(ptr ? d->getAndRef(ptr) : 0), value(ptr)
>> { }
>> 
>> where getAndRef is static method, so value of d is not needed here. I assume this warning should not be emitted.
> 
> The warning seems valid, and the code should be fixed.
> d->getAndRef(ptr) requires that d be evaluated even if getAndRef is
> static, just as f()->getAndRef(ptr) would be required to call f(),
> even though the result would be discarded.

Yes, the base expression must be evaluated, meaning that the pointer value must be loaded;  however, since that value is immediately ignored, this is innocuous, and no undefined behavior is invoked.

John.



More information about the cfe-dev mailing list