听说这段c++代码可以检测一些简单的内存越界

来源:百度知道 编辑:UC知道 时间:2024/07/01 05:00:58
#include<stdio.h>
#define CHECKNU 6893 \\除0外任意值;
#define PRECHECK_FIELD(i) int __precheck##i;
#define POSCHECK_FIELD(i) int __poscheck##i;
#define IN1T_CHECK(o,i){\
(o)->__precheck##i=CHECKNU;\
(o)->__poscheck##i=CHECKNU;\
}
#define CHECK(o,i){\
if((o)->__precheck##i!=CHECKNU ||(o)->__poscheck##i!=CHECKNU){\
printf("%s:%d,memory access out of range with checknu
pre %d,pos %d”,__FILE__,__LINE__,(o)->__precheck##i,(o)->__poscheck##i);\
}\
)

class Base{
public:
PRECHECK_FIELD(0);
char mem[1024];
POSCHECK_FIELD(0);
Base();
int an_op();
private:
};

Base::Base(){
INIT_CHECK(this,0);
}

int Base::an_op(){
CHECK(this,0);
//(some operation on mem field);
CHECK(this,0);
return 0;
}

教教我,最好加个简单的例子
CHECK(this,0);为什么要执行两次呢?

是不是可以在两个语句之间加

Class Base 是测试代码,检测内存越界的代码是下面这段代码
#define CHECKNU 6893 \\除0外任意值;
#define PRECHECK_FIELD(i) int __precheck##i;
#define POSCHECK_FIELD(i) int __poscheck##i;
#define IN1T_CHECK(o,i){\
(o)->__precheck##i=CHECKNU;\
(o)->__poscheck##i=CHECKNU;\
}
#define CHECK(o,i){\
if((o)->__precheck##i!=CHECKNU ||(o)->__poscheck##i!=CHECKNU){\
printf("%s:%d,memory access out of range with checknu
pre %d,pos %d”,__FILE__,__LINE__,(o)->__precheck##i,(o)->__poscheck##i);\
}\
)
说一下他的思路,在每次申明内存块之前后各申明一个标志变量,并赋特定值,这样理论上在内存块里他们是连续的。看下面的语句
PRECHECK_FIELD(0);
char mem[1024];
POSCHECK_FIELD(0);
在每次使用自己定义的内存块mem前后,都检查一下,看之前定义的标志变量有没有被更改,如果有,则内存被越界操作了。

#include <stdio.h>
#include <string.h>
#define CHECKNU 6893 // 除0外任意值;
#define PRECHECK_FIELD(i) int __precheck##i;
#define POSCHECK_FIELD(i) int __poscheck##i;
#define