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
最小测试用例请。 – 2014-10-19 08:06:00
请原谅我,但名称'vmi_read_64_va'意味着此函数读取8个字节的数据。现在,通过将这8个字节读入4字节变量'poolinfo_table'中,您基本上会触发未定义的行为。我的猜测是,在实践中,你重写堆栈中下一个变量的值,这恰好是'i',因此,打印'orig_poolinfo [i]'会给出这个数组中第二个条目的值,而不是第一个条目的值(仅仅是一个猜测,这并不能解释在循环的后续迭代中'i'没有被覆盖)。 – 2014-10-19 08:16:03