V598. The 'memset/memcpy' function is used to nullify/copy fields of 'Foo' class. Virtual table pointer will be damaged.
Анализатор обнаружил, что для работы с классом используются такие низкоуровневые функции, как 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));
}
Данная диагностика классифицируется как:
|
Взгляните на примеры ошибок, обнаруженных с помощью диагностики V598. |