Подтвердить что ты не робот

Какие средства C/С++ могут проверять переполнение буфера?

Мне было предложено поддерживать большую С++-кодовую базу, полную утечек памяти. В то время как я думал, я обнаружил, что у нас много переполнений буфера, которые приводят к утечкам (как это получилось, я никогда не хочу знать).

Я решил сначала удалить переполнение буфера. Чтобы облегчить мой поиск ошибок, какие инструменты можно использовать для проверки переполнения буфера?

4b9b3361

Ответ 1

В Linux я бы использовал Valgrind.

Ответ 2

Рассмотрим использование более современных структур данных как способ избежать переполнения буфера. Чтение в std::string не будет переполняться, а std::vectors намного безопаснее, чем массивы. Я не знаю, что такое ваше приложение, и возможно, что используются буферы raw, потому что вам нужна скорость, но чаще всего они используются, потому что это то, с чем были удобны оригинальные программисты.

Поиск утечек памяти с помощью упомянутых инструментов является хорошей идеей, но они могут не найти всех потенциальных утечек, в то время как использование стандартных строк и классов контейнеров может устранить проблемы, которые вы не осознавали.

Ответ 3

IBM Purify сделает это, вы запустите свое приложение под ним, и оно даст вам отчет обо всех ошибках (включая другие).

Чтобы убить утечки памяти, используйте UMDH - запустите приложение, сделайте снимок памяти, запустите его снова, снимок и затем используйте инструмент diff, чтобы увидеть распределения, сделанные с первого запуска (обратите внимание, что вы должны запускать приложение один раз и делать снимки как можно лучше).

Ответ 4

Проверьте электрический забор, это дизайн только для переполнения буфера! Он не замедляет сам код (но замедляет распределение/освобождение). Он работает и linux и windows.

Он работает, добавляя сегмент без чтения или записи до и после каждого выделенного пространства. Пытаться получить доступ к этой памяти в конечном итоге по причине сбоя сегментации в UNIX и нарушения памяти (или что-то подобное) в Windows.

Ответ 5

Проблема с /GS заключается в том, что она не будет сканировать ошибки. Он просто предупредит вас об этом. Похоже, вы ищете инструмент, который сканирует ваш существующий код для потенциального буфера над/под запусками.

Хорошим инструментом для этого и других дефектов является инструмент Microsoft PreFAST.

Информация здесь

Ответ 6

МС:

  • Инструмент UMDH.exe: http://support.microsoft.com/kb/268343
  • /проанализировать параметр компилятора (бесплатно последний пакет Microsoft SDK)

Ответ 7

Я удивлен, что никто не упомянул Application Verifier (бесплатно!) в Windows. Визуальный детектор утечек (упомянутый в другом ответе) абсолютно изумителен для отслеживания многих типов утечек памяти, но Application Verifier - лучшая собака для отслеживания ошибок памяти, таких как переполнение буфера, двойное освобождение и использование буфера после бесплатного (плюс многие, многие другие).

Изменить: И это очень, очень легко использовать.

Ответ 8

Мой голос идет в Rational Purify. Чрезвычайно мощный с ценой. Делает короткую работу множеством проблем и может действительно заплатить за себя. Кроме того, доступен на большинстве * nix. Однако не уверен в Windows.

Ответ 9

Компонент BoundsChecker Compuware Devpartner делает это очень хорошо с точки зрения динамического исполнения. Для статического тестирования я бы рекомендовал pc-lint и flex-lint в сочетании с Riverblade visual lint для удобства использования и отчетности. Если вам была предоставлена ​​новая база кода, я бы рекомендовал начать со статического анализа с разумно свободными правилами, чтобы вы поймали только неприятные вещи. По мере улучшения кодовой базы вы можете ограничить набор правил.

Если вам нужно сделать это на Windows Mobile/Windows CE, проверьте код Entrek snitch

Еще один инструмент, который следует учитывать, если код делает это в поле, - AQtrace, который в основном анализирует сбои на пользовательских машинах и отправляет вам детали. (На всякий случай все, что связано, очищение, перевязка, валидация и т.д. Пропускает что-то)

Ответ 10

Моя компания Семантические проекты ищет бета-тестеров для выполнения (включая переполнение буфера), который обнаруживает все типы нарушений доступа к памяти, даже те, которые не могут выполнять valgrind и Purify. Это сейчас только для программ Windows C, а не для С++ или других ОС.

EDIT 1 июня 2011 г. Инструмент CheckPointer вышел из строя. Только C/Windows. Обработать несколько диалектов C: MS Visual C, GCC 3/4.

EDIT 5 мая 2012 г. CheckPointer теперь обрабатывает C99, включая проверку вызовов в стандартных библиотеках C и C99.

Ответ 11

Visual Studio имеет флаг компилятора /GS, который добавляет защиту переполнения буфера. Есть ли другие?

Ответ 12

Вы можете попробовать Visual Leak Detector - я использовал его сам, и это первое, что я рекомендовал бы для обнаружения mem-leak.

Ответ 13

Я бы рекомендовал бесплатный инструмент "течеискателя" в CodeProject от Jochen Kalmbach. См. Мой пост для получения дополнительной информации об этой теме (и других ответах) в этом вопросе о утечке памяти

Ответ 14

В Windows для утечки памяти/переполнения буфера и другого обнаружения ошибок во время выполнения вы можете использовать:

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