假设我有一大块动态分配的数据:
void* allocate (size_t n)
{
void* foo = malloc(n);
...
return foo;
}
我希望使用指向的数据foo
作为一种特殊类型,type_t
。但我想稍后再这样做,而不是在分配期间这样做。为了给分配的数据一个有效型,因此我可以这样做:
void* allocate (size_t n)
{
void* foo = malloc(n);
(void) *(type_t*)foo;
...
return foo
}
根据 C11 6.5/6,此左值访问应使有效类型type_t
:
对于对没有声明类型的对象的所有其他访问,对象的有效类型只是用于访问的左值的类型。
然而,该行(void) *(type_t*)foo;
不包含任何副作用,因此编译器应该可以自由地对其进行优化,并且我不希望它生成任何实际的机器代码。
我的问题是:像上面这样的技巧安全吗?为数据提供有效类型是否会产生副作用?或者通过优化代码,编译器是否也会优化有效类型的选择?
也就是说,使用上面的左值访问技巧,如果我现在像这样调用上面的函数:
int* i = allocate(sizeof(int));
*i = something;
这是否会导致严格的别名冲突 UB 如预期的那样,或者是现在的有效类型int
?
您引用的标准中的短语清楚地仅说明了有关access到对象。有效类型的唯一变化object标准描述的是之前的两个短语,它们清楚地描述了您必须将要使其生效的类型存储到对象中。
6.5/6
如果通过类型将值存储到没有声明类型的对象中
左值的类型不是字符类型,则左值的类型变为
该访问和不修改的后续访问的对象的有效类型
存储的值。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)