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)
是的,这正是严格的别名规则所禁止的。然而,编译器通常可以选择禁用对此规则的依赖,例如-fno-strict-aliasing对于 GCC 和 Clang,将在这些编译器的实际意义上定义行为。否则,这些编译器将以非预期的方式对其进行编译,因为别名规则被破坏,从而导致 UB。
sort_bytes或许是个例外。uint8_t通常是unsigned char. unsigned char特别是别名规则有一个例外,并且可以为任何其他类型别名(但反之则不然)。
因此sort_bytes从这个角度来看很好。但是,究竟要读取什么值是实现定义的,并且取决于所涉及类型的表示。在实践中,系统是小端还是大端(或者完全是其他系统)尤其重要。
然而,即使存在别名异常,目前的技术标准也不允许将转换结果视为指向数组。然而,这可能是一个最终会得到解决的缺陷。
| 归档时间: |
|
| 查看次数: |
130 次 |
| 最近记录: |