c语言 - 为什么我收到此内存功能"Access Violation"错误?



在Visual Studio中运行此程序时,我收到一个"访问违规";程序到达内存函数时出错。不管我设置多大的缓冲区,它总是抛出这个读访问冲突错误。我在memcpy函数中设置了断点,只要我继续执行,它就会抛出以下错误:

错误片段

char data[DATA_SIZE] = "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA";
#define DATA_SIZE 27136
void spawn(void * buffer, int length, char * key);
typedef struct {
int  offset;
int  length;
char key[4];
int  gmh_offset;
int  gpa_offset;
char payload[DATA_SIZE];
} phear;
extern char data[DATA_SIZE];
void start(HINSTANCE mhandle) {

phear * payload = (phear *)data;
char * buffer;
buffer = (char *)malloc(payload->length);
memcpy(buffer, payload->payload, payload->length);
/* execute our code */
spawn(buffer, payload->length, payload->key);
/* clean up after ourselves */
free(buffer);
}

这里有几个问题:

  • data可能无法正确对齐phear。参见什么是对齐内存分配?
  • payload->length是一个严格的混叠违反:它被定义为(*payload).length,并且表达式*payload通过phear类型的表达式访问内存,但是在该位置没有phear类型的对象。
  • (如果我们暂时忽略上述两个问题)memcpy读取越界,因为sizeof data < sizeof(phear).

一个简单的解决方案是使用extern phear data;代替char数组。如果你真的想使用char数组,那么使用memcpy来复制数据,而不是使用struct访问。

最新更新