【问题标题】:What happens by modifying read only memory?修改只读内存会发生什么?
【发布时间】:2013-08-16 08:46:55
【问题描述】:

一个标识符在所有情况下都被 const 限定为只读存储吗? 还是会根据运行时间确定?当我要写入“只读”内存时,究竟会发生什么和/或可能发生什么。

const char **cpp;
char *p;
const char c = 'A';
cpp = &p;
*cpp = &c;
*p = 0;

这段代码在任何情况下都会修改 RO 内存吗?还是因为每次我执行它都不是 RO 内存所以这只是工作? 如果是这样,如果 char 存储在 RO mem 中并且我正在执行此代码会发生什么? 行为未定义,这甚至不是问题。但是这段代码是可执行的。 所以我的问题是:修改只读内存会发生什么?

【问题讨论】:

    标签: c compiler-construction constants c99 undefined-behavior


    【解决方案1】:

    基本上,这取决于编译器。很可能 char 将进入堆栈并且不会是只读的(因此,const 意味着只会混淆类型转换,可执行文件中没有任何内容)。堆栈永远不会是只读的。

    如果您将一些const 定义为全局,它很可能会进入DATA 段,该段也不是只读的。因此,您将再次使其全部正常工作。虽然我可以想象编译器将所有 const 放入具有只读访问权限的特殊段中,但在这种情况下,您将遇到通常的访问冲突/段错误。

    另外,你可能有一个聪明的编译器,它会优化整个代码,并用它的值替换任何出现的 const 变量名,在这种情况下,没有什么可以告诉你修改这个变量。嗯,很可能编译器足够聪明,可以看到 &c 来理解变量必须存储在某个地方。

    注意多个最可能可能。未定义的行为是未定义的行为,所以这个答案可以理解为我们不知道会发生什么

    【讨论】:

      【解决方案2】:

      这是未定义的行为,这意味着您无法确切地知道会发生什么。

      并且const 变量不需要在只读内存中。

      C11 6.7.3 类型限定符

      如果尝试通过使用来修改使用 const 限定类型定义的对象 具有非 const 限定类型的左值,行为未定义。如果尝试是 通过使用左值来引用使用 volatile 限定类型定义的对象 对于非 volatile 限定类型,行为未定义。

      【讨论】:

      • 所以写到任何地方都差不多?^^
      • 是的,但我在 c99 中找不到这个,这就是我所指的。
      • @Zaibis 我敢肯定它在 C99 和 C11 中是一样的。我稍后会修改为C99。
      【解决方案3】:

      首先,const 不保证该实现使用任何只读内存技术。它只是告诉编译器该变量是不可变的。然后编译器可以告诉你什么时候破坏了这个不变量。编译器可能会做一些其他聪明的事情,比如优化和使用特殊的存储技术,但这些都是特定于实现的细节。

      【讨论】:

        猜你喜欢
        • 2015-06-30
        • 1970-01-01
        • 2018-06-08
        • 2018-07-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-05-13
        • 2015-09-14
        相关资源
        最近更新 更多