memcmp сравнивает данные, сохраненные в дополнении структуры
Этот дефект возникает при использовании memcmp функция для сравнения двух структур в целом. В процессе сравниваются бессмысленные данные, хранящиеся в заполнении структуры.
Например:
struct structType {
char member1;
int member2;
.
.
};
structType var1;
structType var2;
.
.
if(memcmp(&var1,&var2,sizeof(var1)))
{...}
Если элементы структуры имеют различные типы данных, компилятор вводит дополнительное заполнение для выравнивания данных в памяти. Пример заполнения см. в разделе Higher Estimate of Local Variable Size.
Содержимое этих дополнительных байтов заполнения не имеет смысла. Стандарт C допускает неопределенное содержание этих байтов, давая различным компиляторам свободу для реализации собственного заполнения. При выполнении побайтового сравнения структур с memcmp, вы сравниваете даже бессмысленные данные, хранящиеся в заполнении. Можно сделать ложный вывод о том, что две структуры данных не равны, даже если их соответствующие элементы имеют одинаковое значение.
Вместо сравнения двух структур за одну попытку сравните элементы структур по элементам.
Для эффективного кода запишите функцию, которая выполняет элемент сравнения по элементу. Эта функция используется для сравнения двух структур.
Вы можете использовать memcmp для побайтового сравнения структур, только если известно, что структуры не содержат заполнения. Как правило, для предотвращения заполнения используются определенные атрибуты или прагматики, такие как #pragma pack. Однако эти атрибуты или прагматики поддерживаются не всеми компиляторами и делают реализацию кода зависимой. Если структуры содержат битовые поля, использование этих атрибутов или прагматик не может предотвратить заполнение.
| Группа: Программирование |
| Язык: C | C++ |
| По умолчанию: Вкл для рукописного кода, выкл для сгенерированного кода |
Синтаксис командной строки: MEMCMP_PADDING_DATA |
| Воздействие: среднее |
| CWE ID: 188 |