Как отключить проверку переполнения буфера в среде выполнения Visual C ++? - PullRequest
7 голосов
/ 18 ноября 2009

i и несколько тысяч других людей получают сообщение об ошибке в Microsoft Visual C ++ Runtime:

alt text

Что в пользу поисковых систем говорит:

Microsoft Visual C++ Runtime Library

Buffer overrun detected!

Program: %s

A buffer overrun has been detected which has corrupted the program's
internal state. The program cannot safely continue execution and must
now be terminated.

Теперь я понимаю, что такое переполнение буфера и почему это плохо. Учитывая новый акцент Microsoft на « он просто сломан », дополнительные проверки буфера в MSVCRT могут быть полезны.

С другой стороны, мне все равно. Дело не в том, что программа не может продолжаться, а в том, что она не может безопасно продолжить. Ну, я бы предпочел быть небезопасным, потому что это лучше, чем ничего. Мне нравится жить в опасности.

Так может кто-нибудь предложить что-нибудь? я думал о таких вещах, как:

  • ключ реестра для предотвращения остановки MSVCRT
  • запуск приложения в совместимости с предыдущей операционной системой (предшествующей Windows 7)
  • добавление манифеста сборки в исполняемую папку, чтобы он использовал более старую версию MSVCRT, которая не выполняет проверку переполнения
  • номер версии или место загрузки копии MSVCRT, не имеющей проверки переполнения

Я пытался найти сайт поддержки компании, которая написала Microsoft Visual C ++ Runtime Library , но в них не упоминается, какие функции могут быть переполнены, или как отключить проверку переполнения.

Ответы [ 2 ]

9 голосов
/ 18 ноября 2009

Здесь есть опция.Задайте для него значение *. 1001 *

Свойства проекта -> Свойства конфигурации -> C / C ++ -> Генерация кода -> Проверка безопасности буфера.

Это соответствуетопция компилятора / GS (проверка безопасности буфера) :

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

1 голос
/ 18 ноября 2009

Это происходит в вашем коде или на самом деле в библиотеке? Если это в библиотеке, я знаю, что вы говорите, что хотите просто игнорировать ошибку, но что бы вы сделали, если бы это нарушение прав доступа привело к сбою процесса?

Вы должны относиться к этому так же, потому что логически это одно и то же. Просто ЭЛТ сбивает процесс вместо ОС.

Но, если вы используете отладочную сборку библиотеки, вы можете получить лучшие (?) Результаты, используя сборку выпуска (возможно, она просто вылетит без уведомления диалогового окна).

Если это в вашем коде, вы можете отключить проверку переполнения с помощью параметра / GS-. Но вы должны действительно исправить ошибку.

...