Адресная функциональность, подобная Sanitizer, в MSVC

Приходя из Linux/gcc/clang, я все больше и больше работаю над Windows/Visual Studio.

Чего мне действительно не хватает, так это дезинфицирующего средства для адресов (проверка границ, утечки, использование после освобождения,...). Я провел некоторое исследование, а также попробовал несколько вещей, но не нашел замены, которая была бы полной (по функциям) и надежной. Например, я пробовал Dr. Memory, но узнал, что он не работает для программ на основе Qt (по крайней мере, не в Windows 10).

Итак, как мне получить функциональность, подобную дезинфицирующему средству адресов, в Windows/MSVC?


person Frank Meerkötter    schedule 08.12.2017    source источник
comment
Если msvc не является жестким требованием, тогда разработайте и проверьте в Linux, а затем выполните кросс-компиляцию с помощью gcc и MXE/mingw и т. д. Если вы получили библиотеку с закрытым исходным кодом, скомпилированную с помощью msvc, тогда valgrind все еще работает с Linux. + вино на этом.   -  person Velkan    schedule 11.12.2017
comment
Спасибо за ваш ответ, но я особенно заинтересован в том, чтобы функциональные возможности, описанные в моем вопросе о msvs.   -  person Frank Meerkötter    schedule 11.12.2017


Ответы (2)


По крайней мере, ASan и Ubsan из clang должны работать в Windows с некоторыми ограничениями. Их можно использовать с инструментальными цепочками msvc, используя clang-cl в качестве замены cl.exe. %20Windows.pdf" rel="nofollow noreferrer">работает над этим, Mozilla тоже.

Проблемы, о которых я знаю (и которые не позволяли мне использовать его самостоятельно до сих пор):

  • связывание с необходимыми библиотеками не происходит автоматически. Существует две их версии, в зависимости от того, как CRT связана с вашим приложением (/MT означает статический CRT, /MD означает динамический CRT, последний обычно используется в Qt). Чтобы найти необходимые параметры компоновщика, откройте командную строку Visual Studio, добавьте папку clang bin в путь и скомпилируйте простой main.cpp (пустая функция main) с подробными параметрами с clang-cl следующим образом: clang-cl -v /MD -fsanitize=address main.cpp Требуемая команда link.exe находится в конце подробного вывода, извлеките оттуда необходимые библиотеки для компоновки.

  • в Windows поддерживаются только релизные сборки

  • нет поддержки исключений в Windows (см. эту проблему)

  • кажется, что дальнейшая работа над портом Windows не ведется, например, wiki. ужасно устарел (последнее изменение в 2015 году), поэтому я сомневаюсь, что многие люди используют это продуктивно. Так что получить помощь от других пользователей онлайн может быть довольно сложно...

Говоря о других альтернативах в Windows, есть:

  • Appverifier (поставляется с Windows SDK)
  • Dr Memory (в настоящее время не поддерживается в Windows согласно некоторые комментарии к его системе отслеживания проблем, означающие, что он, например, совершенно непригоден для Qt и всех, кто использует инструкции SSE 4.2, см. здесь и здесь )
  • Intel Inspector (коммерческий).

Дезинфицирующие средства и Valgrind в Linux IMO гораздо более продвинуты и / или имеют гораздо лучшую производительность, чем эти инструменты, поэтому сохранение сборки приложения в Linux кажется лучшей идеей, по крайней мере, при работе с кроссплатформенным набором инструментов, таким как Qt (как вы упоминаете ).

person FourtyTwo    schedule 02.02.2018
comment
Хороший материал в этом ответе. Также имейте в виду, что в библиотеки времени выполнения MSVC встроены довольно хорошие функции отслеживания кучи, но их нужно включить. docs.microsoft.com/en-us/visualstudio/ отладчик/ - person Adrian McCarthy; 02.02.2018
comment
Ссылка Appverifier не работает. Вот прямо сейчас: docs.microsoft.com/ en-us/windows-hardware/drivers/devtest/ - person Andreas; 27.05.2020
comment
@Андреас исправлен. - person FourtyTwo; 27.05.2020

Microsoft интегрировала Address Sanitizer в Visual Studio 2019 версии 16.1, предварительная версия 3 и выше. К сожалению, в настоящее время поддерживается только сборка Linux. Но, по крайней мере, вы по-прежнему можете использовать свою любимую IDE и отлаживать приложения в WSL.

Обновлять:

Также доступно средство очистки адресов для проектов Windows начиная с Visual Studio 2019 версии 16.4

Мы рады объявить о поддержке AddressSanitizer (ASan) для набора инструментов MSVC. ASan — это быстрый детектор ошибок памяти, который может обнаруживать проблемы с памятью во время выполнения, такие как использование после освобождения, и выполнять проверки выхода за пределы. Поддержка дезинфицирующих средств была одним из наших наиболее популярных предложений в сообществе разработчиков, и теперь мы можем сказать, что у нас есть опыт работы с ASan в Windows в дополнение к нашей существующей поддержке проектов Linux.

AddressSanitizer (ASan) для Windows с MSVC

Последний выпуск 16.7 поддерживает как x86, так и x64. (первоначальный выпуск поддерживал только x86).


В Visual Studio 2019 версии 16.1 Preview 3 мы интегрировали AddressSanitizer (ASan) в проекты Visual Studio для Linux. ASan — это детектор ошибок памяти во время выполнения для C/C++, который ловит следующие ошибки:

  • Использовать после free (ссылка на висячий указатель)
  • Переполнение буфера кучи
  • Переполнение буфера стека
  • Использовать после возвращения
  • Использовать после области действия
  • Ошибки порядка инициализации

Пример ошибки ASAN

Вариант ASAN

AddressSanitizer (ASan) для рабочая нагрузка Linux в Visual Studio 2019


Обратите внимание, что в самом MSVC уже есть различные инструменты для отладки проблем с памятью, такие как Куча отладки CRT, упомянутая выше Адрианом Маккарти или Защита потока управления

Есть много инструментов, которые пытаются сделать ваш код безопасным извне: популярные примеры — Valgrind и дезинфицирующие средства адресов/потоков. И многие из этих инструментов есть и в Windows, как от Microsoft, так и от других компаний. Но MSVC включает в себя мощные технологии внутри компилятора, которые интегрируют безопасность с вашим кодом. Например, Control Flow Guard высокооптимизированная функция безопасности, которая борется со многими уязвимостями повреждения памяти. Мы не можем открыто говорить о наших текущих исследованиях в области безопасности, но мы всегда работаем над тем, чтобы защитить ваш код (и наш!) от все более изощренных злоумышленников.

https://devblogs.microsoft.com/cppblog/msvc-the-best-choice-for-windows/

Смотрите также

person phuclv    schedule 10.05.2019
comment
MSVS — ваша любимая IDE для C++? :0 - person Marek R; 17.06.2019
comment
@MarekR здесь не имеет значения. Вопрос про MSVC. В любом случае MSVC с 2017 года и выше — отличная IDE по сравнению со многими другими. - person phuclv; 17.06.2019
comment
Вы можете добавить, что прямо сейчас (16.4) средство очистки адресов с msvc работает только с x86, а не с x64. Мне потребовалось некоторое время, пока я не понял, почему у меня возникают ошибки компоновщика/компилятора при попытке его использования. - person MikeMB; 20.01.2020
comment
@MikeMB Начиная с версии 16.7.7, средство очистки адресов работает как с x64, так и с x86. - person Contango; 31.10.2020