gpt4 book ai didi

c++ - 如何判断我平台上的punning类型是否可以?

转载 作者:行者123 更新时间:2023-12-01 15:10:32 25 4
gpt4 key购买 nike

我有一堆从网络获取二进制Blob的代码。到目前为止,在了解Blob的类型时,我使用了punning类型(伪):

uint8_t* data = network.get();
if(type == "A") {
uint32_t* var = reinterpret_cast<uint32_t*>(data);
...
} else if (type == "B") {
float* var = reinterpret_cast<float*>(data);
...
}

在某些地方有工会:
union A {
float valf;
uint32_t valu;
};

这似乎工作正常,但现在我阅读了有关punning类型的帖子,按照标准,这是UB,应该改用memcpy。然而,事实证明它可以在许多平台上运行。

Q1:有没有一种方法可以测试类型支持在我的平台上是否正常运行?

问题2:我可以期望主流编译器(MSVC,GCC)在平台上对非法类型的警告或警告吗?

最佳答案

Q1: Is there a way to test if type punning is supported and behaves as expected on my platform?



是的,请阅读编译器手册。通常有一章是关于非标准扩展的。例如 gcc C extensionsgcc C++ extensions。如果没有文档记载的非标准扩展名(或者为严格遵循标准进行编译),则必须假定使用此类代码是不安全的且行为未定义。

特别是在传统上,gcc臭名昭著,是在严格违反指针别名的情况下调用未定义的行为。您可以使用 -f-no-strict-aliasing阻止它在优化过程中利用该UB。

通过联合进行类型修剪在C中定义良好,但在C++中未定义。

Q2: Can I expect mainstream compilers (MSVC, GCC) to warn or error on illegal type punning on my platform?



不,这非常罕见。通常,在调用未定义的行为时,您不会期望得到诊断消息。这就是为什么仍然有静态分析器工具市场的原因。同样,许多形式的不确定行为在运行时发生。

关于c++ - 如何判断我平台上的punning类型是否可以?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62402895/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com