Устаревший код, похоже, имеет переполнение, хотя я не уверен

#c #arrays

#c #массивы

Вопрос:

Я сейчас работаю над некоторым устаревшим кодом (конвертируя часть его в C #), и я наткнулся на проблему:

Создается массив байтов (длина равна ulcLen):

 CSLAutoArray<BYTE> pMem(new BYTE[ulcLen]);
  

Теперь некоторые данные помещаются в массив байтов, после чего предполагается, что значение CRC / Hash записывается в первые четыре байта (ULONG / UInt32):

 __CfgCRC(pMem   sizeof(ULONG), ulcLen - sizeof(ULONG))
  

->

 inline ULONG __CfgCRC(const void* const cpcMem, const ULONG ulcMemSize)
{
  ULONG ulRes = 0;

  const BYTE* const cpcUseMem = reinterpret_cast<const BYTE*>(cpcMem);
  for(const BYTE* pcLook = cpcUseMem; cpcUseMem   ulcMemSize > pcLook; pcLook  )
  {
    ulRes ^= static_cast<ULONG>(*pcLook);
    //[...]
  };

  return ulRes;
};
  

Теперь, это только мне кажется, или static_cast считывает 1/2/3 байта в конце массива байтов в конце цикла for? Поскольку pcLook (указатель памяти) увеличивается до тех пор, пока не достигнет полной длины данных (ulclen sizeof(ULONG)) ? Или я ошибаюсь? Или static_cast каким-то образом не считывает конец массива? (CSLAutoArray — это какой-то класс управляемого указателя, но, насколько я вижу, он не мешает этому коду)

Ответ №1:

*pcLook это просто BYTE так что нет, он читает только 1 октет за раз. приведение просто приводит к BYTE , а не к тому, на что pcLock указывает.

Комментарии:

1. ХОРОШО!!! Итак, как он преобразует 1 байт в 4? Означает ли это, что результирующий ULONG также может иметь только максимальное значение 255?

2. обычно BYTE это unsigned char так, что он обнуляет его до размера ULONG … и да, он все равно будет иметь диапазон значений {0 … 255}.