2011-06-24 19 views
2

私のプロジェクトの変数(特にヒープ変数)の仮想アドレスを知る必要があります。変数のポインタ値は実際にはその仮想アドレスです。私の理解は、同じ変数の仮想アドレスが異なる実行で同じでなければならないということです。私もシンプルに書いた同じ変数が異なる実行で異なる仮想アドレスを持つのはなぜですか?

-bash-4.0$ gcc singletest.c 
-bash-4.0$ ./a.out 
Hello World from Node 0 the vm of i is 0x7fffb87a8e00 and 140736288427520 
I am in 0 and the vm of buffer is 0x7fb05dfcf010:140395467829264 
-bash-4.0$ ./a.out 
Hello World from Node 0 the vm of i is 0x7fffec2856f0 and 140737155454704 
I am in 0 and the vm of buffer is 0x7f5888c54010:140018228477968 
-bash-4.0$ ./a.out 
Hello World from Node 0 the vm of i is 0x7fff1f44a780 and 140733717981056 
I am in 0 and the vm of buffer is 0x7fbea3b91010:140456767328272 

、私は自分の考えを証明するために、次の簡単なコードを書いたが、それは間違っていることが判明し、

#include <stdio.h> 
#include <stdlib.h> 
int main(int argc, char **argv) 
{ 
    int node=0; 
    char* buffer; 
    int i; 
    printf("Hello World from Node %d the vm of i is %p and %ld \n",node, &i,&i); 
    buffer = (char*)malloc(sizeof(char)*1024*1024*300); 
    for(i = 0; i < 1024*1024*300; i++){ 
    buffer[i] = (char)1; 
} 
printf("I am in %d and the vm of buffer is %p:%ld \n",node, buffer,buffer); 
return 0; 
} 

しかし、次のように私は別の実行のためのさまざまなポインタ値を得ました各プロセスが単に正確に同じ変数を生成するMPIコード。また、異なるプロセスの同じ変数には異なるポインタ値がありますが、これは私が期待した通りではありません。

これを私に説明できますか? ありがとう、

答えて

1

実行時に変数のアドレスが同じになるという保証はありません。現代のオペレーティングシステムは、プログラムがロードされるアドレスとヒープとスタックのアドレスを変更しようとします。これは、攻撃者が特定の種類のバグを悪用することをより困難にするためです。

特に、あなたのケースでは、見ている変数はヒープに割り当てられたポインタです。ヒープ上にメモリを2回割り当てても同じアドレスが2回生成されることは絶対にありません。

+0

ありがとうございました!アドレスのランダム化が無効になっている場合、2回の実行で同じポインタ値を持つ可能性はありますか?ヒープ変数についても?ありがとう、 –

+0

私は真剣にあなたがこれに頼ることができるかどうか疑問に思います。私はそれをお勧めしません。 –

+0

ランダム化を無効にするには、http://stackoverflow.com/questions/1921485/pseudo-random-stack-pointer-under-linuxの指示に従ってください。ヒープ変数には、実行ごとに固定された仮想アドレスがあります。 –

0

この質問は私のものと類似している:Pseudo-random stack pointer under Linux?

awser内のリンクを記述してそれは、すべてのsercurityの理由で行わです。

+0

はい、アドレススペースのランダム化が私の懸念事項に答えます。ありがとう! –