У меня появилось много ложных срабатываний при запуске анализа кода для C++ в VS11. Например, у меня есть несколько десятков переключателей, и он говорит, что мой указатель может быть нулевым. Все случаи в коммутаторе (по крайней мере в одном случае) указатель установлен, и по умолчанию вызывает мою функцию, которая выдает assert (0) и исключение. Я предполагаю, что, поскольку утверждение и исключение находятся в методе, он не понимает, что невозможно, чтобы указатель был нулевым. Как мне намекнуть или исправить это, так что ложный позитив, подобный этому, не появляется?Рекомендации по анализу кода VS11?
0
A
ответ
1
Если метод, вызванный случаем по умолчанию, ничего не возвращает, вы можете попытаться вернуть ему «ложное» значение null, которое будет присвоено указателю в случае по умолчанию.
Type* MyClass::methodCalledInDefaultCase()
{
pointer = 0;
assert(0);
throw Exception;
return 0; // Hope this doesn't cause unreachable code warning
}
void MyClass::myMethod()
{
pointer = 0;
switch(whatever)
{
case foo:
...
case bar:
....
default:
pointer = methodCalledInDefaultCase();
break;
}
}
Надеюсь, что это поможет.
2
попробуйте использовать _Analysis_assume_(FALSE)
в коммутаторе, он указывает на недостижимый код для компилятора.
Вы также можете украсить функции, которые бросают и не возвращаются с помощью _Analysis_noreturn_
.
ах-ха. Хорошо, я считаю, что это сработает, но я мог бы также создать шаблон fakeptr(), который возвращает указатель на его обман (похожий на поддельный, но иногда полезный auto_cast) –