Так как 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
BSTRatypedefдля другого типа указателя). Это также не сработало, добавив методыtoBSTRиfromBSTRи засорив comutil.h(_bstr_t) и другие места с конверсиями. Наконец, я дошел до того момента, когда компилятор задохнулся в заголовках, созданных из IDL (значения по умолчанию переводятся в буквальные широкие строки).
Короче говоря, я отказался от попыток добиться этого самостоятельно, если кто-нибудь знает инструмент анализа кода, который может помочь, я был бы очень рад услышать об этом.