Re:Baby's First Garbage Collector
by dllthomas on Sunday December 08, 2013 @07:07PM
(#6872159)
Of course, you can make something look like not a pointer and then make it a pointer again if you actually change the zeros and ones.
[ Parent
| on HN ]
Most languages don't give you any guarantees if you do that, though. In C, for example, pointer arithmetic on a void*, or on a pointer cast to an integer, is not guaranteed to produce sensible results. The standard only provides guarantees for pointer arithmetic if it's performed on a non-void pointer that points within an array, and the results remain within the bounds of the same array (arithmetic that produces a pointer pointing outside the array of the base pointer is undefined, with the exception that pointing to one element past the end of the array is defined).
In ordinary C, without a garbage collector, I'd be baffled to find an implementation where one could not:
1) Cast a pointer to an integer of sufficient size.
2) Xor that integer with another value.
3) Xor the result with the same value.
4) Cast back to a pointer.
5) Dereference.
It's sufficiently corner-case that I am not certain what the standard says about it. In any event, pointers matter when coding in assembly, where language standards aren't even relevant.That is actually allowed in the standard; it specifically says that casting a pointer to an integral type of sufficient size is a reversible operation (though it I'm not sure if this is not well defined: (int i[2]; (int )((int)i)+sizeof(int)
Could you have a standards-conforming implementation where pointers were big-endian and other integral values little-endian? That would break your example code. I don't know of any architecture that would motivate that, of course...
You can serialize it to a hex string, put it in a json request that you send off to some cloud service, and then an hour later parse it back out of the json reply, with nothing left in RAM that looks like that pointer for the time inbetween.