[英]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.