Поскольку BSTR
- это всего лишь typedef
для wchar_t*
, у нашей кодовой базы есть несколько (много?) Мест, где строковые литералы передаются методу, ожидающему BSTR
, что может привести к путанице с маршаллерами или кем-либо, ктопытается использовать любой BSTR
специфический метод (например, SysStringLen
).
Есть ли какой-либо способ статически обнаружить этот тип неправильного использования?
Я попытался скомпилировать с VC10 /Wall
и сстатический анализ кода все правила Microsoft , но следующий нарушающий код не помечается ни одним из них.
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 (делая
BSTR
a typedef
для другого типа указателя).Это тоже не сработало, после добавления toBSTR
и fromBSTR
методов и мусора comutil.h (_bstr_t
) и других мест с преобразованиями я наконец-то дошел до того, что компилятор захлебнулся заголовкамисоздается из IDL (значения по умолчанию переводятся в буквально широкие строки).
Короче говоря, я перестал пытаться достичь этого самостоятельно, если кто-нибудь знает инструмент анализа кода, который может помочьЯ был бы очень рад услышать об этом.