[llvm-dev] GEP with a null pointer base

James Y Knight via llvm-dev llvm-dev at lists.llvm.org
Thu Jul 6 12:05:48 PDT 2017


On Thu, Jul 6, 2017 at 2:06 PM, Kaylor, Andrew via llvm-dev <
llvm-dev at lists.llvm.org> wrote:

> I've got a problem that I would like some input on.  The problem basically
> boils down to a program that I am compiling, whose source I don't control,
> doing something like this:
>
>
>
>   p = (char*)0 + n
>
>
>
> where 'n' is an intptr_t-sized value that the program knows is actually a
> valid address for a pointer.
>
>
>
> clang translates this as
>
>
>
>   %p = getelementptr inbounds i8, i8* null, i64 %n
>
>
>
> So far, so good.  The problem is that while LLVM seems to consider the
> above IR to be valid, we officially do not allow dereferencing a pointer
> constructed in this way (if I’m reading the rules correctly).
> Consequently, if this GEP ever gets close enough to a load using the
> pointer, InstCombine will eliminate the GEP and the load.
>
>
>
> I've been told that the '(char*)0 + n' construct is invalid according to
> the C standard.  However, this pattern appears in the glibc malloc
> implementation, so I'd like to be able to handle it anyway.
>

glibc does accept patches...or are you talking about two separate instances
of this problem, both in glibc and something else?
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20170706/d44700d6/attachment.html>


More information about the llvm-dev mailing list