并从一个指针给const除去常量服从用C严格走样,并且是指相同的对象?(Does removing

2019-07-18 11:36发布

请问在C下面的代码定义的行为吗?

int main() {
    const int i = 0;
    return *(int*)(&i);
}

我问,因为6.5 / 7列出为一个有效的别名“与有效对象的类型兼容的类型的合格版本”。 但有效对象的类型是const int ,而且我不认为int是一个合格的版本const int (虽然正好相反)。 既不是intconst int兼容(6.7.3 / 10)。

此外,6.3.2.3/2说,你可以通过添加预选赛转换指针类型,以及所产生的指针相等。 6.3.2.3/7说,你可以将任意两个指针类型(所以剧组(int*)(&i)本身是允许的)。 但并不是说所产生的指针指在同一个对象,甚至它是平等的。 所有它说的是,它可以转换回原来的类型(在这种情况下, const int* )。 也就是说,即使别名是合法的,目前还不清楚,我认为标准的保证,我的指针转换确实导致引用指针i

因此,没有标准实际上定义我的代码的行为,如果是的话这哪里是定义?

我知道,代码工作实践中。 我心里有一个关于它不工作假设(和离奇)执行。 我问是否执行符合标准(如果没有违反,哪些部分),但我不希望如果有在我的想象中执行不符合其他方面把水搅浑。 如果有人认为这将帮助他们回答这个问题,我将描述实现。

Answer 1:

这至少暗示了它的工作原理,通过§6.7.3P5:

如果试图修改通过使用与非const限定的类型的左值与一个常量限定类型定义的对象,则该行为是未定义的。 如果试图指与通过使用具有非易失性限定类型左值的易失性限定类型定义的对象,该行为是未定义。

请注意,对于volatile限定类型,它说是指 ,但对于const限定的类型它只是说, 修改 ,这意味着非修改访问正常(“来证明这一规则的例外 ”)。

它看起来像你对我可能已经确定了标准的缺陷,虽然。



文章来源: Does removing const from a pointer-to-const obey strict aliasing in C, and refer to the same object?