设置哨兵对内存破坏进行检查

    /*
    ** Given an allocation, find the MemBlockHdr for that allocation.
    **
    ** This routine checks the guards at either end of the allocation and
    ** if they are incorrect it asserts.
    */
    static struct MemBlockHdr *sqlite3MemsysGetHeader(void *pAllocation){
      struct MemBlockHdr *p;
      int *pInt;
      u8 *pU8;
      int nReserve;
      p = (struct MemBlockHdr*)pAllocation;
      p--;
      assert( p->iForeGuard==(int)FOREGUARD );
      nReserve = ROUND8(p->iSize);
      pInt = (int*)pAllocation;
      pU8 = (u8*)pAllocation;
      assert( pInt[nReserve/sizeof(int)]==(int)REARGUARD );
      /* This checks any of the "extra" bytes allocated due
      ** to rounding up to an 8 byte boundary to ensure
      ** they haven't been overwritten.
      */
      while( nReserve-- > p->iSize ) assert( pU8[nReserve]==0x65 );
      return p;
    }

通过在分配器的末尾设置一个哨兵值来检查这些哨兵值以确保SQLite内核没有超出缓冲区的两端。

results matching ""

    No results matching ""