const
类型限定符会导致编译器发出错误消息,以防尝试修改声明为const
的对象,但这不足以保护。例如,以下程序修改两个元素声明为const
的数组:
#include <stdio.h>
int main(void)
{
const char buf[2] = { 'a','b' };
const char *const ptr = buf;
unsigned long addr = (unsigned long)ptr;
*(char *)addr = 'c';
addr = addr + 1;
*(char *)addr = 'd';
printf("%c\n", buf[0]);
printf("%c\n", buf[1]);
return 0;
}
所以,事实证明编译器没有足够的防护来保护对象不被修改。我们如何防止这种事情发生呢?
答案 0 :(得分:3)
我不认为应该提供更多保护可以或 。
C编程语言允许您自由地执行几乎所有操作,尤其是从指针访问对象。但是,自由永远不会自由,因此C程序员必须始终小心(如果没有必要,请避免施放)。
答案 1 :(得分:0)
查找内存溢出的标准工具是watchpoints,或者在MS Visual Studio中调用的数据断点。
如果您需要保护对象仅用于调试,请使用调试器在对象内设置观察点。该bug将在运行时发现(不是编译时) - 当您的程序尝试写入指定的地址时,调试器将停止它。
您可以set your watchpoints in your code,但数量有限(x86平台上的最大数量为4),因此这不是您计划的通用功能。
答案 2 :(得分:0)
我认为保护背后的哲学是在自己的代码中使用代码作为现成库的人的安慰。 否则如果有可能在C语言中使对象完全不可修改,那么会有一些破解者可以修改他们想要的任何东西:) :)