Представления значения могут быть неправильно инициализированы или сравнены
Этот дефект происходит, когда вы используете Стандартные библиотечные функции C, чтобы выполнить bytewise операцию на нетривиальных или нестандартных текстовых объектах класса макета. Для определений тривиальных и стандартных классов макета см. Стандарт C++, [класс], абзацы 6 и 7 соответственно.
Средство проверки повышает дефект, когда вы инициализируете или копируете нетривиальные объекты типа класса с помощью этих функций:
std::memset
std::memcpy
std::strcpy
std::memmove
Или когда вы сравниваете нестандартные текстовые объекты класса макета с помощью этих функций:
std::memcmp
std::strcmp
Средство проверки не повышает дефекта, если bytewise операция выполняется через псевдоним. Например, никакой дефект не повышен в bytewise сравнении и операциях копии в этом коде. bytewise операции используют dptr
и sptr
, псевдонимы нетривиального или нестандартного класса макета возражают d
и s
.
void func(NonTrivialNonStdLayout *d, const NonTrivialNonStdLayout *s) { void* dptr = (void*)d; const void* sptr = (void*)s; // ... // ... // ... if (!std::memcmp(dptr, sptr, sizeof(NonTrivialNonStdLayout))) { (void)std::memcpy(dptr, sptr, sizeof(NonTrivialNonStdLayout)); // ... } } |
Выполнение bytewise операции сравнения при помощи Стандартных библиотечных функций C на нетривиальном или нестандартном текстовом объекте класса макета может привести к неожиданным значениям из-за деталей реализации. Объектное представление зависит от деталей реализации, таких как порядок частных и общедоступных членов или использование таблиц указателя виртуальной функции, чтобы представлять объект.
Выполнение bytewise установка операций при помощи Стандартных библиотечных функций C на нетривиальном или нестандартном текстовом объекте класса макета может изменить детали реализации. Операция может привести к аварийному поведению программы или уязвимости выполнения кода. Например, если адрес функции членства перезаписывается, вызов этой функции вызывает неожиданную функцию.
Чтобы выполнить bytewise операции нетривиальный или нестандартный текстовый объект класса макета, используйте их C++ специальные функции членства вместо Стандартных библиотечных функций C.
C стандартные библиотечные функции | Функции членства C++ |
---|---|
| Конструктор класса |
| Конструктор копии класса Конструктор перемещения класса Копирование оператора присваивания Перемещение оператора присваивания |
|
|
Группа: объектно-ориентированный |
Язык: C++ |
Значение по умолчанию: Off |
Синтаксис командной строки:
MEMOP_ON_NONTRIVIAL_OBJ |
Удар: носитель |
Copy of overlapping memory
| Find defects (-checkers)
| Memory comparison of padding data
| Memory comparison of strings