2012-03-10 3 views
0

У меня появилось много ложных срабатываний при запуске анализа кода для C++ в VS11. Например, у меня есть несколько десятков переключателей, и он говорит, что мой указатель может быть нулевым. Все случаи в коммутаторе (по крайней мере в одном случае) указатель установлен, и по умолчанию вызывает мою функцию, которая выдает assert (0) и исключение. Я предполагаю, что, поскольку утверждение и исключение находятся в методе, он не понимает, что невозможно, чтобы указатель был нулевым. Как мне намекнуть или исправить это, так что ложный позитив, подобный этому, не появляется?Рекомендации по анализу кода VS11?

ответ

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; 
    } 
} 

Надеюсь, что это поможет.

+0

ах-ха. Хорошо, я считаю, что это сработает, но я мог бы также создать шаблон fakeptr(), который возвращает указатель на его обман (похожий на поддельный, но иногда полезный auto_cast) –

2

попробуйте использовать _Analysis_assume_(FALSE) в коммутаторе, он указывает на недостижимый код для компилятора.

Вы также можете украсить функции, которые бросают и не возвращаются с помощью _Analysis_noreturn_.