Код здесь генерирует следующее предупреждение: Предупреждение C6385 Чтение недействительных данных из «ключа»: читаемый размер составляет «_Old_2`nelts» байтов, но могут быть прочитаны «2» байта.
Код компилируется и работает нормально. Я много раз перебирал код и не видел, как next_key вышел за границы массива. 1. Изменение объединения на структуру не имеет значения. 2. Как ни странно, при переименовании формального параметра в «ключ» и комментировании локального «ключа» и memcpy () предупреждение не генерируется.
typedef unsigned __int32 uint32_t;
typedef unsigned __int8 uint8_t;
typedef union {
uint8_t bytes[4];
uint32_t dword;
} quartet_t;
#define TABLE_SIZE 16
#define KEY_BUFFER_SIZE 16
uint8_t the_key[KEY_BUFFER_SIZE] = {0x2b,0x7e,0x15,0x16,0x28,0xae,0xd2,0xa6,0xab,0xf7,0x15,0x88,0x09,0xcf,0x4f,0x3c};
int job(uint8_t the_key[KEY_BUFFER_SIZE], uint32_t nelts);
int main()
{
job(the_key, sizeof(the_key));
}
int job(uint8_t _key[KEY_BUFFER_SIZE], uint32_t nelts)
{
int ix;
uint32_t next_key = 0;
quartet_t xlat[TABLE_SIZE];
uint8_t key[KEY_BUFFER_SIZE];
memcpy(key, _key, nelts);
for (ix = 0; ix < TABLE_SIZE; ix++)
{
if (next_key == nelts)
next_key = 0;
xlat[ix].bytes[0] = key[next_key++];
xlat[ix].bytes[1] = key[next_key++];
xlat[ix].bytes[2] = key[next_key++];
xlat[ix].bytes[3] = key[next_key++];
}
return 0;
}
Вывод соответствует ожидаемому, иДругих проблем нет. Я просто хочу понять, если я что-то не так делаю, или это ошибка компилятора.