1

我試圖把一些可能在拍攝中使用的標誌情景教開拓發展gera's Insecure Programming by example程序到客戶端/服務器應用程序。我遇到的問題是我不確定Visual Studio(我正在使用2005專業版)如何決定在堆棧中分配變量的位置。Visual Studio如何決定堆棧變量的分配順序?

當我編譯和運行實施例1:

int main() { 
    int cookie; 
    char buf[80]; 

    printf("buf: %08x cookie: %08x\n", &buf, &cookie); 
    gets(buf); 

    if (cookie == 0x41424344) 
     printf("you win!\n"); 
} 

我得到以下結果:

buf: 0012ff14 cookie: 0012ff64 

buf開始於一個地址比cookie下80個字節,並且被複制任何四個字節在前80年後buf將出現在cookie

我遇到的問題是,當我在其他一些功能把這個代碼。當我編譯和運行下面的代碼,我得到了不同的結果:buf出現在地址大於cookie的。

void ClientSocketHandler(SOCKET cs){ 
int cookie; 
char buf[80]; 
char stringToSend[160]; 
int numBytesRecved; 
int totalNumBytes; 

sprintf(stringToSend,"buf: %08x cookie: %08x\n",&buf,&cookie); 
send(cs,stringToSend,strlen(stringToSend),NULL); 

結果是:

buf: 0012fd00 cookie: 0012fcfc 

現在有沒有辦法通過覆蓋buf來設置cookie的任意數據。有沒有辦法告訴的Visual Studio buf之前分配cookie?有什麼辦法可以事先告訴變量如何分配?

感謝,

傑森

嗯,還好。是的,我猜結構將不得不做。謝謝您的幫助。

回答

2

嘗試關閉編譯器優化。

如果優化已經關閉,強制編譯器把當地人在一個特定的順序最好的辦法是到本地變量放到一個結構,分配在本地棧上的結構。該結構中的字段不太可能被編譯器移動(相對於彼此)而不是獨立局部變量。