0

奇妙なメモリ バグがあります。

コードは簡単です:

void *to = calloc(2, sizeof(uint64_t));
... 
int add_symbol_to_symbol(void *from, void *to) {
  uintptr_t *fromSymbol;
  uintptr_t *toSymbol;
  uint64_t    i;

  fromSymbol = (uintptr_t*) from;
  toSymbol = (uintptr_t*) to;

  for (i = 0; i < 2; i++)
  {
    *toSymbol ^= *fromSymbol;
    toSymbol++;
    fromSymbol++;
  }

  return 0;
}

コードをデバッグしてメモリのアドレスとそのメモリの値を出力すると、xor が発生する前に toSymbol のメモリにゼロ以外の値があることがわかります...ただし、データの出力方法によって異なります.

gdb:

print toSymbol
$21 = (uintptr_t *) 0x650400
(gdb) print (toSymbol+1)
$23 = (uintptr_t *) 0x650408
(gdb) print *(toSymbol)
$25 = 0
(gdb) print *(toSymbol+1)
$24 = 4575657221408423936
(gdb) print *(unsigned long long)(toSymbol+1)
$26 = 0
(gdb) print *(unsigned long long*)(toSymbol+1)
$27 = 4575657221408423936
print *(uintptr_t*)(0x650408)
$30 = 4575657221408423936
(gdb) print *(uintptr_t)(0x650408)
$31 = 0

だから私の質問:

  1. print (uintptr_t )(0x650408) がガベージ データを表示するのはなぜですか?
  2. print *(uintptr)(0x650408) がゼロを表示するのはなぜですか? (つまり、なぜ 64 ビットの 16 進アドレスを 64 ビット アドレスではなく 64 ビット値にキャストすると、何も変更されないのですか!?!)
4

0 に答える 0