【问题标题】:Confusion regarding modification of const variable using pointers关于使用指针修改 const 变量的困惑
【发布时间】:2014-01-27 03:46:31
【问题描述】:

以下示例使我的理解更加混乱。我无法理解如何修改 const 变量 local。请帮助我理解相同的内容。

 /* Compile code without optimization option */
 // volatile.c
 #include <stdio.h>
 int main(void)
 {
     const int local = 10;
     int *ptr = (int*) &local;

     printf("Initial value of local : %d \n", local);

     *ptr = 100;

     printf("Modified value of local: %d \n", local);

     return 0;
}

$ gcc volatile.c -o volatile –save-temps

$ ./volatile

本地初始值:10

local的修改值:100

【问题讨论】:

  • 至于“怎么可能”,那是因为你故意通过非const指针改变它来颠覆它的constness,而你的编译器没有选择放置它在只读内存中或做其他只会导致严重失败的事情。
  • 那么,这是否意味着编译器出错了?它应该有警告
  • 不,这意味着你错了。话虽如此,如果您实际上通过在命令行中添加-std=c99 -pedantic -Wall 将编译器警告提高到合理的水平,我的钱说 gcc 会警告您。
  • 不,因为它也可以 - 并且更容易 - 通过首先不声明 const 来更改值。这是你的程序,没有其他人能够改变这些值,除非你给他们一种方法,或者除非他们修改了你无能为力的可执行文件。真正的安全漏洞是一开始就在程序中保留用户名和密码。

标签: c pointers constants


【解决方案1】:

如果我们查看 C99 草案标准部分 6.7.3类型限定符4 段,这只是 undefined behavior,它说:

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

所以你不能对结果有任何期望,你不应该这样做。

如果我们查看第 2 段,它会说:

与限定类型关联的属性仅对满足以下条件的表达式有意义 是左值。114)

脚注114 说:

实现可以将一个非易失的 const 对象放在 贮存。此外,如果从未使用过此类对象的地址,则实现无需为此类对象分配存储空间。

一般来说,实现不必使 const 变量只读,但它可以,但正如 R.. 指出的那样,在只读内存中放置一个自动变量会很难。

【讨论】:

  • +1 for 可以使 const 变量只读。在嵌入式应用程序中一直发生。
  • 所以,上面的结果刚刚发生。但实际上它可能会或可能不会发生。另外,我没有得到最后一部分“实现可能会将一个非易失性的 const 对象放在存储的只读区域中。此外,如果从不使用它的地址,则实现不需要为这样的对象分配存储。 "
  • @codeymodey in gcc 我可以得到类似的结果,但在 clang 我可以重复你的结果,这是典型的未定义行为。使用online compiler 可以帮助您尝试不同的方法。
  • @codeymodey 易失性变量不能放在只读内存中,因为它们可以从外部源修改,但编译器可以选择将 const 对象放在只读内存中,但没有到。
  • 我的意思是在clangcan not重复结果。
猜你喜欢
  • 2021-07-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-04
相关资源
最近更新 更多