🚀Рассказываем вам о диагностиках в новом релизе, если вы пропустили.

Новая диагностика для C++ разработчиков – V1114.

Диагностическое правило нацелено на проблему с поиском подозрительного использования dynamic_cast при работе с COM-интерфейсами. Зачастую такое использование может привести к доступу к невалидному объекту. Представьте, что вы работаете с COM-интерфейсами IDraw и IShape, которые наследуются от IUnknown. Рассмотрим синтетический пример:

`void foo(IDraw *ptrIDraw) { IShape *ptrIShape = dynamic_cast(ptrIDraw); if (ptrIShape) ptrIShape->GetArea(area); .... }

В коде выше, для преобразования типа используется dynamic_cast. Вместо этого мы рекомендуем использовать функцию QueryInterface, которая предназначена для работы с COM-интерфейсами. В ее функции входят:

  • проверка, что к запрашиваемому интерфейсу можно получить доступ;
  • возвращение указателя на интерфейс;
  • увеличение счетчика ссылок на объект.

Правильный вариант будет выглядеть так:

`void foo(IDraw *ptrIDraw) { IShape *ptrIShape = nullptr; if (SUCCEEDED(ptrIDraw->QueryInterface(IID_IShape, &ptrIShape)) .... }

Это гарантирует, что ваш код будет более надежным и безопасным 😉

#PVS_Studio #cpp``

🚀Рассказываем вам о диагностиках в новом релизе, если вы пропустили.
Новая диагностика для C разработчиков – V1114 | Сетка — социальная сеть от hh.ru