public inbox for gcc-bugs@sourceware.org
help / color / mirror / Atom feed
From: "danielmicay at gmail dot com" <gcc-bugzilla@gcc.gnu.org>
To: gcc-bugs@gcc.gnu.org
Subject: [Bug c/67999] Wrong optimization of pointer comparisons
Date: Wed, 21 Oct 2015 03:21:00 -0000	[thread overview]
Message-ID: <bug-67999-4-pLGVeb1NEe@http.gcc.gnu.org/bugzilla/> (raw)
In-Reply-To: <bug-67999-4@http.gcc.gnu.org/bugzilla/>

https://gcc.gnu.org/bugzilla/show_bug.cgi?id=67999

--- Comment #20 from Daniel Micay <danielmicay at gmail dot com> ---
> I think several issues are mixed:

A conforming C implementation requires either fixing both the compiler and libc
functions to handle > PTRDIFF_MAX objects or preventing them from being
allocated via standard mechanisms (and *ideally* documenting the restriction).
Since there are many other issues with > PTRDIFF_MAX objects (p - q, read/write
and similar uses of ssize_t, etc.) and few reasons to allow it, it really makes
the most sense to tackle it in libc.

> Is it documented?

I don't think musl has documentation like that in general.

> This terminology is quite misleading. It's neither signed nor unsigned. Pointer operand is unsigned while offsets are signed.

Agreed.

> How buggy? Are there bugs filed? Searching for PTRDIFF_MAX finds Zarro Boogs.

It hasn't been treated as a systemic issue or considered as something related
to PTRDIFF_MAX. You'd need to search for issues like ssize_t overflow to find
them. If you really want one specific example, it looks like there's at least
one case of `end - start` in stdlib/qsort.c among other places (char *mid = lo
+ size * ((hi - lo) / size >> 1);). I don't think fixing every usage of `end -
start` on arbitrarily sized objects is the right way to go, so it's not
something I'd audit for and file bugs about.

I did do some testing a while ago by passing > PTRDIFF_MAX size objects to the
standard libc functions taking pointer and size parameters so I'm aware that
it's problematic.

> This is the same restriction as in C11 which is satisfied in the provided example. (If one large number is a problem replace "buf + len" by "(int *)buf + len / sizeof(int)".) So it should work in Clang?

The length is cast to a signed integer of the same size and that negative
signed offset is given as an argument to the inbounds GEP instruction, which is
undefined since it wraps.

> For this to work a compiler have to support for working with huge objects, right?

Well, they might just need a contiguous allocation without the need to actually
use it all at once. It doesn't necessarily require compiler support, but it
could easily go wrong without compiler support if the semantics of the
implementation aren't clearly laid out (and at the moment it's definitely not
documented).


  parent reply	other threads:[~2015-10-21  3:21 UTC|newest]

Thread overview: 24+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
     [not found] <bug-67999-4@http.gcc.gnu.org/bugzilla/>
2015-10-17  8:03 ` glisse at gcc dot gnu.org
2015-10-17  8:14 ` pinskia at gcc dot gnu.org
2015-10-17  8:35 ` schwab@linux-m68k.org
2015-10-17 12:52 ` ch3root at openwall dot com
2015-10-19  2:30 ` danielmicay at gmail dot com
2015-10-19  5:36 ` bugdal at aerifal dot cx
2015-10-19  8:17 ` fw at gcc dot gnu.org
2015-10-19  8:26 ` fw at gcc dot gnu.org
2015-10-19  8:41 ` danielmicay at gmail dot com
2015-10-19  8:47 ` danielmicay at gmail dot com
2015-10-19  9:05 ` fw at gcc dot gnu.org
2015-10-19  9:09 ` fw at gcc dot gnu.org
2015-10-19  9:12 ` danielmicay at gmail dot com
2015-10-19  9:26 ` danielmicay at gmail dot com
2015-10-19  9:55 ` danielmicay at gmail dot com
2015-10-19  9:56 ` rguenth at gcc dot gnu.org
2015-10-19 10:12 ` jakub at gcc dot gnu.org
2015-10-21  2:09 ` ch3root at openwall dot com
2015-10-21  2:18 ` ch3root at openwall dot com
2015-10-21  3:21 ` danielmicay at gmail dot com [this message]
2015-10-28  0:12 ` joseph at codesourcery dot com
2015-10-28  0:20 ` bugdal at aerifal dot cx
2015-10-28  2:29 ` joseph at codesourcery dot com
2015-10-28 18:26 ` ch3root at openwall dot com

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=bug-67999-4-pLGVeb1NEe@http.gcc.gnu.org/bugzilla/ \
    --to=gcc-bugzilla@gcc.gnu.org \
    --cc=gcc-bugs@gcc.gnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).