相关疑难解决方法(0)

何时以及为什么操作系统会在malloc/free/new/delete上将内存初始化为0xCD,0xDD等?

我知道操作系统有时会使用某些模式(如0xCD和0xDD)初始化内存.我想知道的是何时以及为什么会发生这种情况.

什么时候

这是否特定于编译器使用?

对于这个,malloc/new和free/delete的工作方式是否相同?

它是特定于平台的吗?

它会出现在其他操作系统上,例如Linux或VxWorks吗?

为什么

我的理解是这只发生在Win32调试配置中,它用于检测内存溢出并帮助编译器捕获异常.

你能举一个关于这个初始化如何有用的实际例子吗?

我记得读过一些东西(可能在Code Complete 2中),在分配内存时将内存初始化为已知模式是好的,某些模式会触发Win32中的中断,这将导致调试器中出现异常.

这有多便携?

c c++ memory memory-management

120
推荐指数
3
解决办法
3万
查看次数

反汇编中的奇怪函数前导码:push ecx 但未使用

我正在分析 IDA 中的一些代码,但我无法弄清楚一些指令的用途。
该代码以标准函数前导码开头,它将 EBP 的当前值压入堆栈,然后将当前堆栈指针移入 EBP,以便稍后引用与其相关的参数和局部变量。
但随后,它将 ECX 压入堆栈。为什么?我认为没有任何东西作为函数的参数传递给它?
然后它将当前值从 ECX 移动到[ebp+var_4],这似乎是在上一条指令中已经推送到那里的 ECX 值:| 那有什么意义呢?
我的猜测是,它尝试在堆栈上为单个局部变量保留一些空间,var_4但是push ecx如果它已经包含 ECX 的当前值,为什么它会在下一条指令中将 ECX 的当前值移动到其中呢?:P
此外,尽管代码非常短,但我没有看到其中有任何地方可以使用此局部变量:/这似乎是完全无用的代码。这个特定的指令序列出现在其他几个函数中,恰好在它们的前导码中,所以我猜它是编译器生成的东西,但我无法弄清楚它的目的。
有任何想法吗?

; Attributes: bp-based frame

; int __stdcall CloseDevice(HANDLE hObject)
CloseDevice proc near

var_4= dword ptr -4
hObject= dword ptr 8

push  ebp
mov   ebp, esp
push  ecx                          ; WTF?
mov   [ebp+var_4], ecx             ; WTF?
cmp   [ebp+hObject], 0FFFFFFFFh
jz    short loc_BE03C5

mov   eax, [ebp+hObject]
push  eax
call  ds:CloseHandle

loc_BE03C5:
mov   esp, …
Run Code Online (Sandbox Code Playgroud)

x86 assembly ida disassembly

5
推荐指数
0
解决办法
258
查看次数

标签 统计

assembly ×1

c ×1

c++ ×1

disassembly ×1

ida ×1

memory ×1

memory-management ×1

x86 ×1