Hos*_*ork 5 c strict-aliasing language-lawyer
有了这些定义:
struct My_Header { uintptr_t bits; }
struct Foo_Type { struct My_Header header; int x; }
struct Foo_Type *foo = ...;
struct Bar_Type { struct My_Header header; float x; }
struct Bar_Type *bar = ...;
Run Code Online (Sandbox Code Playgroud)
说这个C代码("案例一")是否正确:
foo->header.bits = 1020;
Run Code Online (Sandbox Code Playgroud)
......实际上与此代码("case two")在语义上是不同的:
struct My_Header *alias = &foo->header;
alias->bits = 1020;
Run Code Online (Sandbox Code Playgroud)
我的理解是它们应该是不同的:
情况一考虑分配不能影响Bar_Type中的标题.它只被视为能够影响其他Foo_Type实例中的标头.
情况二,通过强制通过通用别名指针进行访问,将导致优化器实现所有可能包含a的类型的所有投注struct My_Header.它将通过任何指针类型与访问同步. (例如,如果你有一个Foo_Type指向实际上是什么的Bar_Type,它可以通过标题访问并可靠地找出它有哪些 - 假设标题位可以告诉你的东西.)
这依赖于优化器不会变得"聪明"并将案例二重新设置为案例一.
该代码bar->header.bits = 1020;与 完全相同 struct My_Header *alias = &bar->header; alias->bits = 1020;。
严格的别名规则是根据通过左值访问对象来定义的:
\n\n\n\n\n6.5p7 对象的存储值只能由具有以下类型之一的左值表达式访问:
\n
唯一重要的是左值的类型以及左值指定的对象的有效类型。不在于您是否将左值派生的一些中间阶段存储在指针变量中。
\n\n注意:自从发布以下文本后,该问题已被编辑。以下文本适用于空间由 分配的原始问题malloc,而不是截至 8 月 23 日的当前问题。
关于代码是否正确。您的代码相当于N2013 rev 1571effective_type_9.c中的 Q80 ,这是对现有 C 实现的调查,着眼于起草改进的严格别名规则。
\n\n\nQ80。将结构写入 malloc\xe2\x80\x99d 区域后,是否可以通过指向在相同偏移处具有相同叶成员类型的不同结构类型的指针来访问其成员?
\n
绊脚石是代码是否(*bar).header.bits = 1020;只设置了位的有效类型int;或整个*bar. 因此,读取是(*foo).header.bits读取一个int,还是读取整个*foo?
只读取 anint不会构成严格的别名冲突(读为intas也可以int);但读Bar_StructasFoo_Struct会构成违规。
本文的作者认为 write 是为了设置整个 的有效类型*bar,尽管他们没有给出这样做的理由,而且我在 C 标准中没有看到任何文本来支持这一立场。
在我看来,目前对于您的代码是否正确没有明确的答案。
\n| 归档时间: |
|
| 查看次数: |
172 次 |
| 最近记录: |