c - 从指向 const 的指针中删除 const 是否遵循 C 中的严格别名,并引用同一个对象?

标签 c constants language-lawyer strict-aliasing

C 中的以下代码是否具有已定义的行为?

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

我问是因为 6.5/7 将“与对象的有效类型兼容的类型的合格版本”列为有效别名。但是对象的有效类型是const int,我不认为intconst int的合格版本(虽然反过来是真的)。 intconst int 都不兼容 (6.7.3/10)。

此外,6.3.2.3/2 说您可以通过添加 限定符来转换指针类型,并且生成的指针是相等的。 6.3.2.3/7 表示您可以转换任意两种指针类型(因此允许转换 (int*)(&i) 本身)。但并没有说结果指针指的是同一个对象,甚至是相等的。它只是说它可以转换回原始类型(在本例中为 const int*)。也就是说,即使别名是合法的,我也不清楚标准是否保证我的指针转换确实会导致指向 i 的指针。

那么,该标准是否真的定义了我的代码的行为,如果是,它是在哪里定义的?

我知道代码在实践中有效。我想到了一个假设的(奇怪的)实现,它在上面不起作用。我可以问该实现是否符合标准(如果不符合,它违反了哪一部分),但如果还有其他方面我想象的实现不符合,我不想混淆水域。如果有人认为这有助于他们回答问题,我将描述实现。

最佳答案

根据 §6.7.3 p5,至少暗示它有效:

If an attempt is made to modify an object defined with a const-qualified type through use of an lvalue with non-const-qualified type, the behavior is undefined. If an attempt is made to refer to an object defined with a volatile-qualified type through use of an lvalue with non-volatile-qualified type, the behavior is undefined.

请注意,对于 volatile 限定类型,它表示 refer to,但对于 const 限定类型,它只是表示 modify,这意味着非修改访问是可以的(“证明规则的异常”)。

不过,在我看来,您可能发现了标准中的缺陷。

关于c - 从指向 const 的指针中删除 const 是否遵循 C 中的严格别名,并引用同一个对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14437699/

相关文章:

c - 理解一个shellcode例子

无法通过 DNS 欺骗欺骗主机命令

c++ - 数据库或文件系统访问的 const 语义

c++ - 是否可以检测 C++ 中的 namespace 成员身份?

c++ - Pimpl - 为什么可以在不完整的类型上调用 make_unique

c++ - 将字符打印到控制台应用程序

c++ - 命名数组元素,或 union 内的结构和数组

javascript - ReactJS 中的错误 "Assignment to constant variable"

c++ - T const & 在函数的返回类型中意味着什么?

c++ - 编译器真的强制执行纯虚拟析构函数吗?