[cfe-dev] False warning in recent clang
Richard Trieu
rtrieu at google.com
Fri Jun 22 13:23:47 PDT 2012
On Fri, Jun 22, 2012 at 11:51 AM, John McCall <rjmccall at apple.com> wrote:
> 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.
>
> This looks like the result of r158477 which extended the -Wuninitialized
checking on field initializers. This only happens when dereferencing
pointers. If d was a class instead of a pointer to a class, this warning
would not have triggered. It should be possible to special case this
during the field check to ignore static calls on a dereferenced pointer.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-dev/attachments/20120622/cf4de6c1/attachment.html>
More information about the cfe-dev
mailing list