簡體   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