On Sat, 2021-06-19 at 16:23 +0100, Dmitrii Pasechnik wrote:
> > I don't think I understand.
> 
> p[] occupies a continuous memory area, starting from p[0], but p[-1]
> is not guaranteed by the standard to be accessible for you (well,
> unless you control the memory layout by placing p in a struct, not as
> the 1st member, but then why would you need p[-1] in the 1st place?)
> 
> What's unclear about it?

The problem is that your initial premise is not correct.  p here is not
an array, it's a pointer.  If we had declared it like this:

    char p[10]

then p[-1] would be problematic.  But, we don't declare that.

We declare it like this:

    char *p

so p is a pointer.  It points to some memory, and it can (and does)
move both forward AND backward through that memory, via p+X and p-X.
That's perfectly legitimate and not illegal or a hack in any way.

I guess the compiler believes that it's possible that p might point to
the very start of some legitimate memory, and if that were true then
p[-1] (or, equivalently, *(p-1)) would be undefined behavior.

But, as human programmers we can examine this code and understand that
actually, it's never possible for p to point to the first character of
the array: we know that eval_strings->idx is never 0, so we know that p
will always be incremented past the beginning of the memory buffer:

      p = value = alloca (len);
      for (i = 0; i < eval_strings->idx; ++i)
        {
            ...
          *(p++) = ' ';
        }
      p[-1] = '\0';


  • [bug #60798] ... anonyme
    • [bug #60... Paul D. Smith
      • Re: ... Dmitrii Pasechnik
        • ... Paul Smith
          • ... Eli Zaretskii
          • ... Dmitrii Pasechnik
            • ... Paul Smith
              • ... Andreas Schwab
                • ... David A. Wheeler
                • ... RANDRIANAINA Georges Aaron
        • ... Dmitry Goncharov via Bug reports and discussion for GNU make
          • ... Dmitrii Pasechnik
            • ... Eli Zaretskii
      • [bug... Jouke Witteveen
        • ... Edward Welbourne
          • ... Jouke Witteveen
        • ... Jouke Witteveen

Reply via email to