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 |
Влияние: носитель |
ID CWE: 188 |