V598. The 'memset/memcpy' function is used to nullify/copy the fields of 'Foo' class. Virtual table pointer will be damaged by this.


Анализатор обнаружил, что для работы с классом используются такие низкоуровневые функции, как memset() или memcpy(). Это недопустимо, если класс ссылается на таблицу виртуальных методов. Функции memset()/memcpy() могут затереть указатель на таблицу виртуальных методов (VPTR) и тогда поведение программы будет непредсказуемо.

Рассмотрим пример кода.

class MyClass
{
  int A, B, C;
  char buf[100];
  MyClass();
  virtual ~MyClass() {}
};

MyClass::MyClass()
{
  memset(this, 0, sizeof(*this));
}

Обратите внимание, что в классе есть виртуальный деструктор. Это значит, что в классе присутствует указатель на таблицу виртуальных функций. Программист поленился очищать члены класса по отдельности. Для очистки он использовал функцию memset(). Это привет к порче VPTR, так как функция memset() ничего про него не знает.

Корректный код:

MyClass:: MyClass() : A(0), B(0), C(0)
{
  memset(buf, 0, sizeof(buf));
}

Согласно Common Weakness Enumeration, потенциальные ошибки, найденные с помощью этой диагностики, классифицируются как CWE-665.

Взгляните на примеры ошибок, обнаруженных с помощью диагностики V598.


Найденные ошибки

Проверено проектов
363
Собрано ошибок
13 495

А ты совершаешь ошибки в коде?

Проверь с помощью
PVS-Studio

Статический анализ
кода для C, C++, C#
и Java

goto PVS-Studio;