----- Original Message -----
> From: "Jiangning Liu" <[email protected]>
> To: "[email protected] for LLVM" <[email protected]>,
> [email protected]
> Sent: Tuesday, November 4, 2014 8:23:13 PM
> Subject: A question about nonnull value of auto_ptr
>
> Hi,
>
>
> For the following small test case,
>
>
> #include <iostream>
> #include <memory>
>
>
> class C {
> public:
> std::auto_ptr<const C> pc;
>
>
> int f(void);
> };
>
>
> int C::f(void) {
> return (&*this->pc == 0);
> }
>
>
> clang/llvm -O2 optimizes (&*this->pc == 0) to be false statically,
> while gcc doesn't.
>
>
> So my question is if this optimization is really safe?
>
Yes, the program here is not well defined. Calling operator*() on an auto_ptr,
according to the standard, "Requires: get() != 0
". (see D.10.1.2). Generally speaking, binding a reference to a null pointer is
undefined behavior. Changing the program to this->pc.get() != 0 should fix the
problem.
-Hal
>
>
> Front-end result shows the auto pointer is nonnull, i.e.
> dereferenceable(8), and this is why llvm back-end can optimize the
> comparison away, but the problem is can we really assume &*this->pc
> is not 0? Why?
>
>
>
> ; Function Attrs: nounwind uwtable
> define i32 @_ZN1C1fEv(%class.C* %this) #2 align 2 {
> entry:
> %this.addr = alloca %class.C*, align 8
> store %class.C* %this, %class.C** %this.addr, align 8
> %this1 = load %class.C** %this.addr
> %pc = getelementptr inbounds %class.C* %this1, i32 0, i32 0
> %call = call dereferenceable(8) %class.C*
> @_ZNKSt8auto_ptrIK1CEdeEv(%"class.std::auto_ptr"* %pc) #1
> %cmp = icmp eq %class.C* %call, null
> %conv = zext i1 %cmp to i32
> ret i32 %conv
> }
>
>
> BTW, this issue triggered a run-time crash for one of SPEC
> benchmarks.
>
>
> Thanks,
> -Jiangning
> _______________________________________________
> cfe-commits mailing list
> [email protected]
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
>
--
Hal Finkel
Assistant Computational Scientist
Leadership Computing Facility
Argonne National Laboratory
_______________________________________________
cfe-commits mailing list
[email protected]
http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits