繁体   English   中英

在Visual Studio 2013中调用malloc时由64位编译器生成的奇怪代码

[英]Strange code generated by 64-bit compiler when calling malloc in Visual Studio 2013

由Visual Studio 2013为x64编译时,以下C代码将导致将0xFFFFFFFFFFFFFFFF传递给malloc()而不是预期的0:

#include <stdlib.h>

int main(int argc, char *argv[]) {
    int x = -1;
    void *p = malloc(x + 1);
}

打开反汇编视图将显示以下奇怪的片段(调试配置,尽管Release在功能上相同):

; int x = -1;
mov         dword ptr [x],0FFFFFFFFh  
; void *p = malloc(x + 1);
mov         eax,dword ptr [x]  
add         eax,1  
mov         eax,eax  
mov         rcx,0FFFFFFFFFFFFFFFFh  
cmovb       rax,rcx  
mov         rcx,rax  
call        qword ptr [__imp_malloc (07F79C80B228h)]  
mov         qword ptr [p],rax

强制转换为size_t不会改变任何内容,但是将结果存储到一个临时变量中,然后将其传递给malloc()将会。

奇怪的是,调用其他类似声明的函数时,不会发生这种情况:

void * __cdecl foo(size_t y) {
    return NULL;
}

int main(int argc, char *argv[]) {
    int x = -1;
    void *p = foo(x + 1);
}

在这种情况下,将生成正确的代码(请注意缺少的cmovb内容):

; int x = -1;
mov         dword ptr [x],0FFFFFFFFh  
; void *p = foo(x + 1);
mov         eax,dword ptr [x]  
inc         eax  
cdqe  
mov         rcx,rax  
call        foo (07F6AB84100Ah)  
mov         qword ptr [p],rax

我犹豫称其为代码生成错误。 我必须假设这是我所缺少的东西。 但是,我以前从未见过这种情况,它肯定会产生错误的行为。

为什么会这样呢?

这是对整数溢出保障措施(如在评论中引用在这里 )。

如果传递给malloc的值是整数溢出(有符号或无符号)的结果,而不是让程序分配的内存比编译器认为的要少,它会最大化表达式并尝试分配该值。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM