Запись 8 байт в переменную на 4 байта
От: Аноним  
Дата: 18.08.09 09:38
Оценка:
Есть функция:


BOOLEAN HashAdd(
  __in ULONG value,
  __in ULONG data,
  __inout ULONG *table,
  __out_opt ULONG *dataTable,
  __in ULONG tableSize)
{
  ULONG i = value % tableSize;
  BOOLEAN cycle = FALSE;
  
  while (table[i] > 0)
  {
    i++;
    
    if (i == tableSize)
    {
      if (cycle)
      {
        return FALSE;
      }
      else
      {
        i = 0;
        cycle = TRUE;
      }
    }
  }
  
  table[i] = value;
  
  if (dataTable) dataTable[i] = data;
  
  return TRUE;
}


http://www.microsoft.com/whdc/devtools/tools/prefast.mspx на строчке

if (dataTable) dataTable[i] = data;


выдает сообщение

(PFD)Buffer overrun while writing to 'dataTable': the writable size is '1*4' bytes, but '8' bytes may be written.


Код 32-битный, как могут быть записаны 8 байт я понять не могу.
Может глюк PreFast?
Re: Запись 8 байт в переменную на 4 байта
От: Pavel Dvorkin Россия  
Дата: 18.08.09 09:48
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Может глюк PreFast?


Возможно. Если работаешь с Visual Studio, включи режим предупреждений /W4 и посмотри на варнинги.
With best regards
Pavel Dvorkin
Re[2]: Запись 8 байт в переменную на 4 байта
От: Weberd  
Дата: 18.08.09 10:28
Оценка:
Здравствуйте, Pavel Dvorkin, Вы писали:

PD>Возможно. Если работаешь с Visual Studio, включи режим предупреждений /W4 и посмотри на варнинги.


Попробовал /W4. Ничего насчет этой функции нет.
Re[3]: Запись 8 байт в переменную на 4 байта
От: Weberd  
Дата: 18.08.09 10:51
Оценка:
Может быть проблема в том, что я передаю в эту функцию HANDLE, а он 64-битных системах занимает 8 байт, в то время как ULONG остается размером 4 байта?
Re: Запись 8 байт в переменную на 4 байта
От: superlexx  
Дата: 18.08.09 12:10
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Есть функция:


А> __out_opt ULONG *dataTable,

А> __in ULONG tableSize)

простые указатели PREFast считает указателями на один элемент. Надо было примерно так:
__out_opt_ecount(tableSize) ULONG *dataTable,
если tableSize в элементах (а не в байтах).
Re[4]: Запись 8 байт в переменную на 4 байта
От: byleas  
Дата: 18.08.09 13:27
Оценка:
Здравствуйте, Weberd, Вы писали:

W>Может быть проблема в том, что я передаю в эту функцию HANDLE, а он 64-битных системах занимает 8 байт, в то время как ULONG остается размером 4 байта?

Да.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.