#include <iostream>
#include <iomanip>
#include <string>
#include <cstring>
#define LOG(index, cv, ncv) std::cout \
<< std::dec << index << ".- Address = " \
<< std::hex << &cv << "\tValue = " << cv << '\n' \
<< std::dec << index << ".- Address = " \
<< std::hex << &ncv << "\tValue = " << ncv << '\n'
int main(int argc, char **argv)
{
const unsigned int const_value = 0xcafe01e;
// Try with no-const reference
unsigned int &no_const_ref = const_cast<unsigned int &>(const_value);
no_const_ref = 0xfabada;
LOG(1, const_value, no_const_ref);
// Try with no-const pointer
unsigned int *no_const_ptr = const_cast<unsigned int *>(&const_value);
*no_const_ptr = 0xb0bada;
LOG(2, const_value, (*no_const_ptr));
// Try with c-style cast
no_const_ptr = (unsigned int *)&const_value;
*no_const_ptr = 0xdeda1;
LOG(3, const_value, (*no_const_ptr));
// Try with memcpy
unsigned int brute_force = 0xba51c;
std::memcpy(no_const_ptr, &brute_force, sizeof(const_value));
LOG(4, const_value, (*no_const_ptr));
// Try with union
union bad_idea
{
const unsigned int *const_ptr;
unsigned int *no_const_ptr;
} u;
u.const_ptr = &const_value;
*u.no_const_ptr = 0xbeb1da;
LOG(5, const_value, (*u.no_const_ptr));
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8aW9tYW5pcD4KI2luY2x1ZGUgPHN0cmluZz4KI2luY2x1ZGUgPGNzdHJpbmc+CgojZGVmaW5lIExPRyhpbmRleCwgY3YsIG5jdikgc3RkOjpjb3V0IFwKICAgICAgICA8PCBzdGQ6OmRlYyA8PCBpbmRleCA8PCAiLi0gQWRkcmVzcyA9ICIgXAogICAgICAgIDw8IHN0ZDo6aGV4IDw8ICZjdiA8PCAiXHRWYWx1ZSA9ICIgPDwgY3YgPDwgJ1xuJyBcCiAgICAgICAgPDwgc3RkOjpkZWMgPDwgaW5kZXggPDwgIi4tIEFkZHJlc3MgPSAiIFwKICAgICAgICA8PCBzdGQ6OmhleCA8PCAmbmN2IDw8ICJcdFZhbHVlID0gIiA8PCBuY3YgPDwgJ1xuJwoKaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQp7CiAgICBjb25zdCB1bnNpZ25lZCBpbnQgY29uc3RfdmFsdWUgPSAweGNhZmUwMWU7CgogICAgLy8gVHJ5IHdpdGggbm8tY29uc3QgcmVmZXJlbmNlCiAgICB1bnNpZ25lZCBpbnQgJm5vX2NvbnN0X3JlZiA9IGNvbnN0X2Nhc3Q8dW5zaWduZWQgaW50ICY+KGNvbnN0X3ZhbHVlKTsKICAgIG5vX2NvbnN0X3JlZiA9IDB4ZmFiYWRhOwogICAgTE9HKDEsIGNvbnN0X3ZhbHVlLCBub19jb25zdF9yZWYpOwoKICAgIC8vIFRyeSB3aXRoIG5vLWNvbnN0IHBvaW50ZXIKICAgIHVuc2lnbmVkIGludCAqbm9fY29uc3RfcHRyID0gY29uc3RfY2FzdDx1bnNpZ25lZCBpbnQgKj4oJmNvbnN0X3ZhbHVlKTsKICAgICpub19jb25zdF9wdHIgPSAweGIwYmFkYTsKICAgIExPRygyLCBjb25zdF92YWx1ZSwgKCpub19jb25zdF9wdHIpKTsKCiAgICAvLyBUcnkgd2l0aCBjLXN0eWxlIGNhc3QKICAgIG5vX2NvbnN0X3B0ciA9ICh1bnNpZ25lZCBpbnQgKikmY29uc3RfdmFsdWU7CiAgICAqbm9fY29uc3RfcHRyID0gMHhkZWRhMTsKICAgIExPRygzLCBjb25zdF92YWx1ZSwgKCpub19jb25zdF9wdHIpKTsKCiAgICAvLyBUcnkgd2l0aCBtZW1jcHkKICAgIHVuc2lnbmVkIGludCBicnV0ZV9mb3JjZSA9IDB4YmE1MWM7CiAgICBzdGQ6Om1lbWNweShub19jb25zdF9wdHIsICZicnV0ZV9mb3JjZSwgc2l6ZW9mKGNvbnN0X3ZhbHVlKSk7CiAgICBMT0coNCwgY29uc3RfdmFsdWUsICgqbm9fY29uc3RfcHRyKSk7CgogICAgLy8gVHJ5IHdpdGggdW5pb24KICAgIHVuaW9uIGJhZF9pZGVhCiAgICB7CiAgICAgICAgY29uc3QgdW5zaWduZWQgaW50ICpjb25zdF9wdHI7CiAgICAgICAgdW5zaWduZWQgaW50ICpub19jb25zdF9wdHI7CiAgICB9IHU7CgogICAgdS5jb25zdF9wdHIgPSAmY29uc3RfdmFsdWU7CiAgICAqdS5ub19jb25zdF9wdHIgPSAweGJlYjFkYTsKICAgIExPRyg1LCBjb25zdF92YWx1ZSwgKCp1Lm5vX2NvbnN0X3B0cikpOwoKICAgIHJldHVybiAwOwp9Cg==