gpt4 book ai didi

c++ - 什么时候类型双关指针在实践中是安全的?

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:27:46 25 4
gpt4 key购买 nike

我的一位同事正在编写大量使用二进制数据数组的 C++ 代码。在某些地方,他有这样的代码

char *bytes = ...
T *p = (T*) bytes;
T v = p[i]; // UB

这里,T有时可以是shortint(分别假设为16位和32位)。

现在,与我的同事不同,我属于“如果可能的话就不要 UB”的阵营,而他更倾向于“如果它有效,那就没关系”。我很难说服他。

鉴于:

  1. bytes 实际上来自此编译单元之外的某处,是从某个二进制文件中读取的。

  2. 可以安全地假设数组确实包含原生字节序中的整数。

在实践中,考虑到主流的 C++ 编译器,如 MSVC 2017 和 gcc 4.8,以及 Intel x64 硬件,这样的事情真的安全吗?我知道如果 Tfloat(过去被它咬过)就不会了。

最佳答案

char* 可以在不违反严格的别名规则的情况下为其他实体添加别名。

仅当 p + i 最初不是 T 时,您的代码才是 UB。

char* byte = (char*) floats;
int *p = (int*) bytes;
int v = p[i]; // UB

但是

char* byte = (char*) floats;
float *p = (float*) bytes;
float v = p[i]; // OK

如果 byte 的来源是“未知的”,编译器就不能利用 UB 进行优化,应该假定我们处于有效情况并据此生成代码。但是你怎么保证它是未知的呢?即使在 TU 之外,链接时间优化之类的东西也可能允许提供隐藏信息。

关于c++ - 什么时候类型双关指针在实践中是安全的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50870581/

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