1

я пытаюсь изучить статический вариант анализа кода в VS 2013. Я написал очень простой код нижеvisual studio 2013 статический анализ кода - насколько он надежный?

int main() 
{ 
    int a, b; //found unused variable 
    std::cout << "Hello world!"; 
    std::cin >> a; 

    int* i = new int; // analysis didn't find this memory leak 
    //delete i; 
    //i = NULL; 
} 

при запуске анализа кода по данному блоку, я ожидаю, что это находит Int * I = новый Int ; и предупреждает об утечке памяти, но он не нашел, но нашел неиспользованную переменную b.

Так что теперь я в путанице, утечка памяти - самая распространенная ошибка в C/C++ &, этот инструмент не смог найти это. Теперь мой вопрос: можем ли мы полагаться на этот анализ или нет?

Окружающая среда: Windows 7, VS конечной 2013.

+1

неиспользуемые переменные довольно просты в поиске, но более глубокий анализ кода на кодекс - это нечто иное. Хотя версия Visual Studio версии 2013 отнюдь не старая, если она является бесплатной версией, которую вы используете, я подозреваю, что, возможно, вы не видите более сложные возможности компилятора. Я помню в visual studio 2008 express, который был бесплатным, что он не мог полностью оптимизировать; вам пришлось заплатить за полную/профессиональную версию визуальной студии для этих возможностей компилятора. – ron

+0

Microsoft любит бросать возможности своих продуктов, но они не позволяют легко понять и найти информацию обо всех различных версиях, а также то, что есть или не доступно в каждом ... например, VS2015-сообщество против профессионального и корпоративного. – ron

+0

@ron Спасибо за повтор, Да, я думаю, что это причина, я загрузил бесплатную версию и использовал ее. – NDestiny

ответ

0

Это не та проблема кода, /analyze (ака PREfast) предназначен для обнаружения. Существуют и другие распространенные инструменты для обнаружения прямых утечек памяти, таких как CRT Debug Heap - см. MSDN. Возможно, вы должны использовать функциональность C++ 11, такую ​​как std::unique_ptr, и не всегда есть, чтобы не забудьте позвонить delete.

#include <memory> 
int main() 
{ 
    int a, b; //found unused variable 
    std::cout << "Hello world!"; 
    std::cin >> a; 

    auto i = std::make_unique<int>() 
} 

Что /analyze предназначено сделать, это предоставить некоторые из «дополнительных предупреждений» вы получаете от продуктов, таким как пуха, но главным образом сделать проверку между процедурным размером буфера с помощью SAL аннотации.

Это своего рода ошибка находит:

void someFunction(char *buffer, size_t len) 
{ 
    ... 
} 

void otherFunction() 
{ 
    char buff[128]; 
    someFunction(buff, 256); 
} 

При добавлении необходимого SAL, которая передает отношения между указателем и размером:

void someFunction(_Out_writes_(len) char *buffer, size_t len) 

цепями Это предположения, которые получают нарушаются и приводят к переполнению буфера, очень трудно найти, а не столько утечек памяти.

Другой полезной функцией /analyze является проверка аргументов PRINTF переменной длины vs. формат строки:

void printf_debug(_In_z_ _Printf_format_string_ const char* format, ...) 
{ 
    ... 
} 


void otherFunction() 
{ 
    unsigned long l; 
    std::wstring str; 
    std::string str2; 

    ... 

    printf_debug("%i %s %d", i, str.c_str(), str2.c_str()); 
} 

VS 2015 и VS 2017 теперь включает несколько предупреждений, которые раньше были только в /analyze в VS 2013 или ранее, как теневые переменные и базовая проверка печати (если вы пишете свои собственные функции стиля printf, вы все равно должны использовать /analyze с _Printf_format_string_). /analyze продолжает предоставлять анализ буфера на основе SAL, который не является частью стандартного компилятора.

/analyze технология PREFast может обнаружить потенциальные утечки памяти в некоторых случаях (в частности, с обеспечением безопасности исключений C++), разыменования потенциально нулевых указателей, используя неинициализированный память и т.д. Она также имеет много дополнительных правил для работы с ядром -модулирование кодирования и записи драйверов, особенно отслеживание блокировок, уровни IRQL и т. д.

Prefast And SAL Annotations

Для C#, /analyze является FXCop инструментом, который является инструментом анализа кода плюс «стиль силовик» для .NET.

Смежные вопросы