🚀Рассказываем вам о диагностиках в новом релизе, если вы пропустили.
Новая диагностика для 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``· 22.10
Динамик каст вообще нельзя тут использовать! Почему бы не воспользоваться CComQIPtr???
ответить
еще контент в этом сообществе
еще контент в этом соообществе
войдите, чтобы увидеть
и подписаться на интересных профи