C/C++ 未处理的读取冲突

C/C++ strcpy unhandled read violation

本文关键字:读取 冲突 未处理 C++      更新时间:2023-10-16
unsigned char* Data::getAddress(unsigned char* address)
{
    strcpy((char*)address, (char*)this->_address);
    return (unsigned char*)address;
}
int main()
{
    Data d;
    d.makealinkedlisthere();
    while (d)
    {
       unsigned char address[256];
       printf("0x%08x rn",d.getAddress(address));
       d = d.getNext();
    }
    return 0;
}

它返回前两个(这是相同的,它应该是不同的[可以从调试器中看出]...),然后崩溃。

它只是创建一个链表。 受保护的成员Data* _next...他们一连串。

无符号字符* 来自 Windows 函数VirtualQueryEx它返回的MEMORY_BASIC_INFORMATION数据结构的一部分。

this->_address = (unsigned char*)meminfo->BaseAddress; // casted from void*

它是 void*,但我看到它在其他人的代码中转换为无符号字符*。在调试器中,我可以看到它表示为十六进制数。

D1: +    _address   0x7ffd5000 <Bad Ptr>    unsigned char * 
D1->_next:+  _address   0x7f6f0000 "áå•ú`©" unsigned char * 
D1->_next->_next+    _address   0x7ffb0000 " "  unsigned char *

MEMORY_BASIC_INFORMATION。基址是页面区域的位置,而不是字符串,并且不能保证它将以空终止。从 MSDN 站点,您可以看到MEMORY_BASIC_INFORMATION结构

typedef struct _MEMORY_BASIC_INFORMATION {
  PVOID  BaseAddress;
  PVOID  AllocationBase;
  DWORD  AllocationProtect;
  SIZE_T RegionSize;
  DWORD  State;
  DWORD  Protect;
  DWORD  Type;
} MEMORY_BASIC_INFORMATION, *PMEMORY_BASIC_INFORMATION;

要复制数据,应使用大小 = 255' 的memcpy

回顾您的代码,如果没有其他问题,将其更改为

PVOID Data::getAddress(PVOID address,size) {    
    memcpy((address, (void *)this->_address, size);
    address[size]=NULL;
    return address;
}
int main() {
    Data d;
    d.makealinkedlisthere();
    while (d) {
       unsigned char address[256];
       printf("Address: 0x%08x n",d.getAddress((PVOID)address),sizeof(address));
       printf("Data: %sn",(LPSTR)d.getAddress((PVOID)address),sizeof(address));
       d = d.getNext();
    }
    return 0;
}

应该工作

另请注意,在memcpy之前存储RegionSize并进行边界检查是安全的。