Working By Example
Now that we've learned how to use pointers.py, lets build some small scripts to try out some of its features.
Making one equal two
Note: This may not work depending on your build of CPython.
Lets start out with creating a pointer to 1, and then moving 2 to it:
from pointers import _
ptr = _&1
ptr <<= 2
assert 1 == 2
Running this will work just fine, and no AssertionError will be raised.
But how do we revert our changes now? 1 has been overwritten, so we can't just move a 1 back into the pointer.
If you want, you can take a second to think about how to do it.
We can cache our 1 by using memory allocation. Since the 1 will be copied to its own memory space, it won't get affected by overwriting 1.
You can try this out yourself.
from pointers import malloc, _
one = malloc(28)
one <<= 1
ptr = _&1
ptr <<= 2
print(1, ~one)
Running this will output 2 1!
Ok, lets allocate a 1 before we overwrite it:
from pointers import malloc, free, _
cache = malloc(28)
cache <<= 1
ptr = _&1
Then, lets move the allocated 1 back into our pointer at the end of the program:
ptr = _&1
ptr <<= 2
assert 1 == 2
ptr <<= ~cache
assert 1 != 2
Don't forget to free the memory as well:
free(cache)
Here's the final result:
from pointers import malloc, free, _
cache = malloc(28)
cache <<= 1
ptr = _&1
ptr <<= 2
assert 1 == 2
ptr <<= ~cache
assert 1 != 2
free(cache)