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

Новая диагностика для 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
repost

507

input message

напишите коммент

Динамик каст вообще нельзя тут использовать! Почему бы не воспользоваться CComQIPtr???

ответить

еще контент в этом сообществе

еще контент в этом соообществе

войдите, чтобы увидеть

и подписаться на интересных профи

в приложении больше возможностей

пока в веб-версии есть не всё — мы вовсю работаем над ней

сетка — cоциальная сеть для нетворкинга от hh.ru

пересекайтесь с теми, кто повлияет на ваш профессиональный путь