strict-aliasing 相关问题

严格别名是由C或C ++编译器做出的假设,即取消引用指向不同类型对象的指针永远不会引用相同的内存位置(即它们不会相互别名)。

通过 std::bit_cast()ed 指针进行别名访问

违反严格别名规则会产生未定义的行为,例如当通过网络将结构发送到 char 缓冲区时,然后该 char 指针以 C 风格/reinterpret_cast 转换为结构

回答 1 投票 0

gcc -O3 诊断警告:'<U ea0>' 未初始化 - UB、bug 或“名称修改”?

在回答这个问题时,我萌生了一个想法,想绕过不将浮点数转换为指针的 C 约束,并想出了这段令人讨厌的异国情调的人工代码: (显然我们

回答 1 投票 0

在 C++ 中,你可以使用一种空类型作为另一种空类型的存储吗?

在C++中,参考标准,使用placement new来获取指向没有成员的结构体的指针,使用另一个没有成员的结构体作为存储是否安全?像下面这样:

回答 1 投票 0

在 C++ 中,你可以对空类型进行类型双关吗?

在C++中,参考标准,使用placement new来获取指向没有成员的结构体的指针,使用另一个没有成员的结构体作为存储是否安全?像下面这样:

回答 1 投票 0

如何解决 C 中的严格别名问题?

我的目标是制作一个通用的竞技场分配器,其缓冲区存储在可执行文件的 .bss 部分中,以避免实际程序中的任何分配,但这在严格的 C 中存在问题

回答 1 投票 0

通过指针访问结构体中的结构体是未定义的行为吗? [重复]

我有一个包含结构体B的结构体A,我通过指针pa访问A,通过指针ba访问b。这是未定义的行为(严格别名规则)吗? (struct B部分不是通过指针访问的...

回答 2 投票 0

我们是否违反严格别名规则?

此代码中是否违反了严格别名规则?我认为 int -> char 和 int -> std::byte 都可以,但是 int8_t 呢? int main() { int arr[8] = {1, 1, 1, 1, 1, 1, 1, 1}...

回答 1 投票 0

当内存来自 malloc 时,将 char * 转换为另一种指针类型是否会违反严格的别名规则?

我读到 char * - 及其带符号和不带符号的对应项 - 可以为任何类型别名,而不会违反严格的别名规则。然而,让 char * 指向 int 变量并转换该 ch...

回答 1 投票 0

std::start_lifetime_as()的实现

在 C++20 中接受 P0593R6(“为低级对象操作隐式创建对象”)后,C++23 将获得 std::start_lifetime_as() ,它“完成了[P0593..中提出的功能”。 .

回答 2 投票 0

C 中初始成员、公共初始序列、匿名联合和严格别名如何相互作用?

因此,在严格的别名规则下,有几件事是明确允许的(为了清楚起见,让我们在 C23 中这样做): 第一个也是最明显的是结构体允许使用指针别名...

回答 1 投票 0

std::as_writable_bytes何时触发未定义的行为

我以为我终于理解了reinterpret_cast和严格别名,然后我遇到了这个例子,稍微修改了https://en.cppreference.co上的“无效标量”示例...

回答 1 投票 0

在 C++14 中放置 new + reinterpret_cast:格式良好?

考虑以下 C++14 中的示例: alignas(T) 无符号字符数据[sizeof(T)]; 新(数据)T(); T* p = reinterpret_cast(数据); p->某事(); // 布? 这段代码合法吗?或者是

回答 1 投票 0

指向 std::byte 的指针是否具有与 char* 相同的别名松弛?

C++(和 C)严格的别名规则包括 char* 和 unsigned char* 可以为任何其他指针别名。 AFAIK 对于 uint8_t* 没有类似的规则。 因此我的问题是:别名规则是什么......

回答 1 投票 0

交换不同类型的两个对象的位的符合标准的方式

考虑以下两个函数: 模板 模板 无效交换1(T * t,S * s) { static_assert(sizeof(T) == sizeof(S)); 字符 tmp[大小...

回答 1 投票 0

通过 char* 访问指针的对象表示是未定义的行为吗?

我知道这是一个奇怪的问题,但只是很好奇。 字符* ptr = 0; strcpy( (char*) &ptr, "UB?"); 这段代码的意思是“我将使用 ptr 的内存作为 char 数组。” 我认为'这是绝对的...

回答 3 投票 0

你能通过 T 的结构来为 T 的数组起别名吗,类似于 std::complex<T>[N] 可以为 T[N * 2] 起别名吗?

自 C++11 起,std::complex[n] 保证可别名为 T[n*2],并具有明确定义的值。这正是人们对任何主流架构所期望的。 这是保证吗

回答 3 投票 0

作者基于强制转换的可选<bool>实现在 P2641 中定义良好吗?

在 P2641r4:检查联合替代方案是否处于活动状态中,作者提供了可选的实现作为激励示例,并声称这是格式良好的。 结构 OptBool ...

回答 1 投票 0

如何安全地打破严格的别名规则?

已知以下示例违反了严格的别名规则,因此在经过优化和未经优化的情况下会产生不同的结果: int foo( 浮点数 *f, int *i ) { *我= 1; ...

回答 1 投票 0

正确使用类型双关和擦除对象数组

我的目标是拥有一个用于存储对象数组的内存池非模板类。 相同的内存池对象必须可重用于不同的数组(不同大小、不同类型和/或

回答 1 投票 0

是否可以将 std::byte 向后移植到 C++14

std::byte 在 C++17 中定义为: 枚举类字节:无符号字符{}; 我目前坚持使用 C++14,我想知道我是否在 C++14 中添加相同的定义(在某些非 std 命名空间中,以及...

回答 1 投票 0

© www.soinside.com 2019 - 2024. All rights reserved.