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++ |
По умолчанию: On для рукописного кода, off для сгенерированного кода |
Синтаксис командной строки: MEMCMP_PADDING_DATA |
Влияние: Средний |
ИДЕНТИФИКАТОР CWE: 188 |