Представления значений могут быть неправильно инициализированы или сравнены
Этот дефект возникает, когда вы используете функции библиотеки C Standard для выполнения байтовой операции с нетривиальными или нестандартными объектами типа класса размещения. Определения тривиальных и стандартных классов размещения см. в Стандартах C++, [класс], абзацы 6 и 7 соответственно.
Проверка поднимает дефект, когда вы инициализируете или копируете нетривиальные объекты типа класса, используя эти функции:
std::memset
std::memcpy
std::strcpy
std::memmove
Или при сравнении объектов типа нестандартного класса размещения с помощью этих функций:
std::memcmp
std::strcmp
Проверка не поднимает дефект, если байтовая операция выполняется через псевдоним. Для примера ни один дефект не возникает при байтовом сравнении и копировании операций в этом коде. В байтовых операциях используются 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)); // ... } } |
Выполнение операций сравнения по байту при помощи функций библиотеки C Standard на нетривиальном или нестандартном объекте типа класса размещения может привести к неожиданным значениям из-за деталей реализации. Представление объекта зависит от деталей реализации, таких как порядок частных и публичных представителей или использование таблиц указателей на виртуальные функции для представления объекта.
Выполнение операций байтовидной настройки при помощи функций библиотеки C Standard на нетривиальном или нестандартном объекте типа класса размещения может изменить детали реализации. Операция может привести к ненормальному поведению программы или уязвимости выполнения кода. Для образца, если адрес представителя функции перезаписан, вызов этой функции вызывает неожиданную функцию.
Чтобы выполнить байтовые операции, нетривиальный или нестандартный объект типа класса размещения, используйте эти специальные функции представителя C++ вместо функций библиотеки C Standard.
Функции стандартной библиотеки C | Представители C++ |
---|---|
| Конструктор классов |
| Конструктор копирования классов Конструктор перемещения классов Оператор копирования назначения Оператор переноса назначения |
|
|
Группа: Объектно-ориентированная |
Язык: C++ |
По умолчанию: Off |
Синтаксис командной строки
: MEMOP_ON_NONTRIVIAL_OBJ |
Влияние: Средний |
Copy of overlapping memory
| Find defects (-checkers)
| Memory comparison of padding data
| Memory comparison of strings