Так как a BSTR
является только typedef
для wchar_t*
, наша база кода имеет несколько (много?) мест, где строковые литералы передаются методу, ожидающему BSTR
, это может испортить маршаллеры или кого-либо, кто пытается использовать любой специальный метод BSTR
(например, SysStringLen
).
Есть ли способ статически обнаружить этот тип неправильного использования?
Я попробовал компиляцию с VC10 /Wall
и с анализом статического кода Microsoft All Rules, но следующий фрагмент кода не может быть отмечен ни одним из них.
void foo(BSTR str)
{
std::cout << SysStringLen(str) << std::endl;
}
int _tmain()
{
foo(L"Don't do that");
}
Обновление:. После попытки аннулировать wtypes.h
для обнаружения таких видов нарушений я отказался.
Я пробовал два пути, оба из которых я получил, чтобы работать с моей примерной программой выше, но как только я попробовал реальный проект, они потерпели неудачу.
- создайте класс с именем
BSTR
, но посколькуVARIANT
имеетBSTR
в качестве члена объединения, новый класс не может иметь никаких конструкторов или операторов присваивания, которые были разбиты на все места,NULL
рассматривался какBSTR
. Я попытался заменитьNULL
на тип, который имеет операторы преобразования, но после добавления десятков новых операторов (сравнение, преобразование и т.д.) Я начал сталкиваться с неоднозначными вызовами и сдавался. - Затем я попробовал способ, предложенный @CashCow и @Hans (make
BSTR
atypedef
для другого типа указателя). Это также не сработало, добавив методыtoBSTR
иfromBSTR
и засорив comutil.h(_bstr_t
) и другие места с конверсиями. Наконец, я дошел до того момента, когда компилятор задохнулся в заголовках, созданных из IDL (значения по умолчанию переводятся в буквальные широкие строки).
Короче говоря, я отказался от попыток добиться этого самостоятельно, если кто-нибудь знает инструмент анализа кода, который может помочь, я был бы очень рад услышать об этом.