这是一个我认为会调用未定义行为的玩具示例:
#include <cstdint>
#include <iostream>
#include <vector>
int
main()
{
std::vector<uint16_t> foo = {0, 0x42F6};
std::cout << *reinterpret_cast<float*>(foo.data()) << std::endl;
return 0;
}
我非常确定取消引用该结果reinterpret_cast
会违反严格的别名规则。然而:
$ g++ --version
g++ (Ubuntu 5.4.0-6ubuntu1~16.04.10) 5.4.0 20160609
$ g++ -fstrict-aliasing -Wstrict-aliasing -fsanitize=undefined -std=c++14 -o a a.cpp
$ ./a
123
编译器或 UB 清理程序没有发出任何警告。为什么不?
为什么这种类型的双关不是未定义的行为?
你的前提是错误的。行为is不明确的。
编译器没有警告...为什么不呢?
编译器不需要对 UB 发出警告。有时当星星对齐时确实如此,但编译器证明 UB 存在的成本通常过高。事实上,如果它was如果有可能,那么语言规则可能会指定该程序是格式错误的。
或 UB 消毒剂。为什么不?
UB 消毒剂并不完美。它无法检测到所有 UB。考虑提交功能请求以实现此案例的检测 - 假设尚未提出请求。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)