Aliasing accesses through a std::bit_cast()ed pointer(通过std::bit_cast()指针进行别名访问)
问题描述
违反严格别名规则会产生未定义的行为,例如,通过网络将结构发送到字符缓冲区,然后该字符指针被C样式/std::reinterpret_cast()强制转换为结构指针。
C++std::bit_cast() function看起来可以用来在(实现?)定义的方式,即不违反严格的别名规则。
示例:
#include <sys/types.h>
#include <netinet/in.h>
#include <bit>
int get_sock_addr(const struct sockaddr *a)
{
struct sockaddr_in *x = std::bit_cast<struct sockaddr_in*>(a);
return x->sin_addr.s_addr;
}
因此,get_sock_addr()的调用方以某种方式获取了sockaddr指针,并确定它实际上指向sockaddr_in结构。
那么,通过std::bit_cast()进行指针强制转换是有效的用例吗?
还是以某种方式也会产生未定义的行为?
如果是定义的行为,标准是否将这种指针强制转换归类为实现定义的行为?
std::bit_cast() proposal提到:
如果没有与的对象表示形式对应的值表示形式,则返回值未指定。
如果不同的指针表示不兼容,以至于它们不能相互对应,那么符合标准的编译器是可能的吗?
推荐答案
转换指针值无关紧要。重要的是对象。您有一个指向X类型的对象的指针,但该指针的类型是Y。尝试通过指向无关类型Y的指针/引用访问X类型的对象是UB的来源。
您是如何获得这些指针的,这几乎无关紧要。因此,bit_cast在这方面并不比reinterpret_cast好。
如果没有sockaddr_in,则不能假装存在。但是,C++20中的implicit object creation可能已经解决了这个问题,这取决于您的代码。如果是,仍然您如何获取指针都无关紧要。
这篇关于通过std::bit_cast()指针进行别名访问的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:通过std::bit_cast()指针进行别名访问
基础教程推荐
- 为什么 typeid.name() 使用 GCC 返回奇怪的字符以及如 2022-09-16
- GDB 显示调用堆栈上函数地址的当前编译二进制文 2022-09-05
- CString 到 char* 2021-01-01
- 如果我为无符号变量分配负值会发生什么? 2022-01-01
- 非静态 const 成员,不能使用默认赋值运算符 2022-10-09
- 为什么派生模板类不能访问基模板类的标识符? 2021-01-01
- 初始化列表*参数*评估顺序 2021-01-01
- 通过引用传递 C++ 迭代器有什么问题? 2022-01-01
- 为什么 RegOpenKeyEx() 在 Vista 64 位上返回错误代码 2021-01-01
- 我应该对 C++ 中的成员变量和函数参数使用相同的名称吗? 2021-01-01
