Re: How to force gcc to blackhole registers so that things maybe garbage collected?

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Wed, May 22, 2019 at 10:54:19PM +0300, Alexander Monakov wrote:
> On Wed, 22 May 2019, Hamad Ahmed wrote:
> >  As an example,
> > the C standard disallows casting a pointer to an int,
> > doing operations on the int, and then casting back to a pointer.
> 
> Not true; if the int is sufficiently wide so that pointer representation
> is not truncated, if after your operations you got back the same int, you're
> guaranteed that casting back to a pointer results in the original pointer.

This is implementation-defined, see 6.3.2.3/5 and /6.

GCC defines it as follows:

     When casting from pointer to integer and back again, the resulting
     pointer must reference the same object as the original pointer,
     otherwise the behavior is undefined.  That is, one may not use
     integer arithmetic to avoid the undefined behavior of pointer
     arithmetic as proscribed in C99 and C11 6.5.6/8.

> Moreover, in C you can write a pointer representation into a file using
> printf("%p"), then some time later read it back from that file using
> scanf("%p"), and you'll get back the original pointer.  Of course between
> the printf and the scanf said pointer value might not exist in the address
> space of your program at all.

scanf %p:

p
    Matches an implementation-defined set of sequences, which
    should be the same as the set of sequences that may be produced by
    the %p conversion of the fprintf function. The corresponding
    argument shall be a pointer to a pointer to void. The input item
    is converted to a pointer value in an implementation-defined
    manner. If the input item is a value converted earlier during the
    same program execution, the pointer that results shall compare
    equal to that value; otherwise the behavior of the %p conversion
    is undefined.

You cannot validly dereference a pointer if the object it points to does
no longer exist, not in standard C anyway.


Segher



[Index of Archives]     [Linux C Programming]     [Linux Kernel]     [eCos]     [Fedora Development]     [Fedora Announce]     [Autoconf]     [The DWARVES Debugging Tools]     [Yosemite Campsites]     [Yosemite News]     [Linux GCC]

  Powered by Linux