C/C++ 厳密な別名付け

この記事を読んでメモ。

明らかにおかしな参照やポインタのキャストによるアクセスはコンパイラの最適化によって無視される可能性があるよって話。

uint32_t f(uint32_t a) {
    uint16_t *p = &a; // uint16_t は uint32_t の別名とはなり得ない
    // p は a を指す事はないとされるため、
    // ここからの p を通した a に対する変更は無視される可能性がある。

    // ~~~

    return a; // 最終的に正しくない値が帰るかも
}

例外として、文字型(符号有無 char)はどのようなメモリに対しても別名となる事が出来ます。