将整数视为较小整数 UB 的数组吗?

Max*_*axB 4 c++ undefined-behavior

将整数视为较小整数 UB 的数组吗?

比如这段代码中是否有UB:

#include <iostream>
#include <cstdint>
#include <algorithm> // sort

void sort_bytes(std::uint32_t& x) {
    std::uint8_t* p = (std::uint8_t*)&x;

    std::sort(p, p+4);
}

void sort_words(std::uint32_t& x) {
    std::uint16_t* p = (std::uint16_t*)&x;

    std::sort(p, p+2);
}


int main() {
    const std::uint32_t x = 1234342542u;
    std::uint32_t y = x, z = x;
    std::cout << x << std::endl;
    sort_bytes(y);
    std::cout << y << std::endl;
    sort_words(z);
    std::cout << z << std::endl;
}
Run Code Online (Sandbox Code Playgroud)

use*_*522 8

是的,这正是严格的别名规则所禁止的。然而,编译器通常可以选择禁用对此规则的依赖,例如-fno-strict-aliasing对于 GCC 和 Clang,将在这些编译器的实际意义上定义行为。否则,这些编译器将以非预期的方式对其进行编译,因为别名规则被破坏,从而导致 UB。

sort_bytes或许是个例外。uint8_t通常是unsigned char. unsigned char特别是别名规则有一个例外,并且可以为任何其他类型别名(但反之则不然)。

因此sort_bytes从这个角度来看很好。但是,究竟要读取什么值是实现定义的,并且取决于所涉及类型的表示。在实践中,系统是小端还是大端(或者完全是其他系统)尤其重要。

然而,即使存在别名异常,目前的技术标准也不允许将转换结果视为指向数组。然而,这可能是一个最终会得到解决的缺陷。