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

2024-12-25 08:07:33
推荐回答(2个)
回答1:

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前后,都检查一下,看之前定义的标志变量有没有被更改,如果有,则内存被越界操作了。

回答2:

#include
#include
#define CHECKNU 6893 // 除0外任意值;
#define PRECHECK_FIELD(i) int __precheck##i;
#define POSCHECK_FIELD(i) int __poscheck##i;
#define INIT_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);
printf("\n");
//(some operation on mem field);
CHECK(this,0);
return 0;
}

void main()
{
char str[] = "This is a test";
Base a;
strcpy(a.mem - 1, str);
a.an_op();
}