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