【问题标题】:Protecting memory from changing保护内存不被改变
【发布时间】:2011-11-23 20:37:12
【问题描述】:

有没有办法保护内存区域?

我有这个结构:

#define BUFFER 4
struct
{
    char s[BUFFER-1];
    const char zc;
} str = {'\0'};

printf("'%s', zc=%d\n", str.s, str.zc);

它应该操作长度为BUFFER-1的字符串,并保证它以'\0'结尾。

但是编译器只给出错误:

str.zc='e'; /*error */

如果不是:

str.s[3]='e'; /*no error */

如果使用 gcc 和一些标志进行编译,那也很好。

谢谢, 贝科

【问题讨论】:

  • 谢谢。我马上去看看。
  • @VladLazarenko 我没有看到像问题中指出的那样保护结构内的单个字节的方法。仅通过寄存器保护页面。

标签: gcc constants protection


【解决方案1】:

要在运行时检测错误,请查看 gcc 中的 -fstack-protector-all 选项。在尝试检测像您描述的那样非常小的溢出时,它的用途可能有限。

不幸的是,您不会找到很多关于检测缓冲区溢出场景的信息,就像您在编译时描述的那样。从 C 语言的角度来看,语法是完全正确的,并且该语言为您提供了足够的绳索来吊死自己。如果你真的想保护自己的缓冲区,你可以编写一个数组访问的前端,在它允许访问你想要的内存之前验证索引。

【讨论】:

  • 谢谢。那么是否可以触发信号呢?我不知道怎么做,我们需要一点创造力。不用担心性能。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-12-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-01
相关资源
最近更新 更多