C Ошибка компилятора или чего мне здесь не хватает? - PullRequest
0 голосов
/ 26 октября 2019

Код здесь генерирует следующее предупреждение: Предупреждение 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;
}

Вывод соответствует ожидаемому, иДругих проблем нет. Я просто хочу понять, если я что-то не так делаю, или это ошибка компилятора.

...