2014-10-19 52 views
0

這裏是我的代碼的一部分,我讀了內核數據結構的一些領域,並將其與數組進行比較。但是奇怪我看到,當我打印陣列orig_poolinfo的內容的第一個元素是103雖然它實際上是128比較c中的兩個整數數組奇怪

int get_poolinfo_fields(vmi_instance_t vmi) 
{ 
int orig_poolinfo[]={128,103,76,51,25,1,32,26,20,14,7,1}; 
uint64_t poolinfo_table_addr = 0xffffffff81ca4fc0;//kernel 3.11 
int poolinfo_table; 
int i; 

    //for(i=0;i<12;i++) 
    // printf("poolinfo_table=%d %d\n",i,orig_poolinfo[i]); 
    for(i=0;i<12;i++) 
    { 
     vmi_read_64_va(vmi,poolinfo_table_addr, 0, &poolinfo_table); 
     printf("poolinfo_table=%d orig_poolinfo[%d]=%d\n",poolinfo_table,i,orig_poolinfo[i]); 
     if(poolinfo_table != orig_poolinfo[i]) 
      printf("hi\n");//return(1); 
     poolinfo_table_addr = poolinfo_table_addr + 0x4; 
    } 
return(0); 
} 

,這是輸出:

poolinfo_table=128 orig_poolinfo[0]=103 
hi 
poolinfo_table=103 orig_poolinfo[1]=103 
poolinfo_table=76 orig_poolinfo[2]=76 
poolinfo_table=51 orig_poolinfo[3]=51 
poolinfo_table=25 orig_poolinfo[4]=25 
poolinfo_table=1 orig_poolinfo[5]=1 
poolinfo_table=32 orig_poolinfo[6]=32 
poolinfo_table=26 orig_poolinfo[7]=26 
poolinfo_table=20 orig_poolinfo[8]=20 
poolinfo_table=14 orig_poolinfo[9]=14 
poolinfo_table=7 orig_poolinfo[10]=7 
poolinfo_table=1 orig_poolinfo[11]=1 
+1

最小測試用例請。 – 2014-10-19 08:06:00

+1

請原諒我,但名稱'vmi_read_64_va'意味着此函數讀取8個字節的數據。現在,通過將這8個字節讀入4字節變量'poolinfo_table'中,您基本上會觸發未定義的行爲。我的猜測是,在實踐中,你重寫堆棧中下一個變量的值,這恰好是'i',因此,打印'orig_poolinfo [i]'會給出這個數組中第二個條目的值,而不是第一個條目的值(僅僅是一個猜測,這並不能解釋在循環的後續迭代中'i'沒有被覆蓋)。 – 2014-10-19 08:16:03

回答

2

您正在混合兩種不同類型int和uint64_t。它們的尺寸可能不一樣。

通過使用vmi_read_64_va()您複製8個字節。如果sizeof(int)在你的系統上是4,你會得到未定義的行爲。這意味着任何事情都可能發生,並且你的程序行爲不正確。

使用適合您的字體大小的功能,不要混合使用類型。