Visual C ++ "Ошибка отладки" - PullRequest
3 голосов
/ 16 января 2012

Я скомпилировал код с использованием Visual Studio 2010, затем попытался запустить его, к сожалению, во время тестирования иногда возникали ошибки «Ошибка отладочного подтверждения!» .... Выражение (без сохранения) (c + 1) <= 256 </strong>

Затем я попробовал тот же сценарий, но с использованием gcc, и он запустился без проблем.Есть идеи, как насчет этой проблемы?

Ответы [ 4 ]

5 голосов
/ 16 января 2012

Вы вызываете функцию типа isalpha () или isdigit () с целым числом, значение которого не является одним байтом 0-255.

3 голосов
/ 16 января 2012

Существует фрагмент кода, который говорит: «на данный момент мы ожидаем, что выражение (unsigned)(c + 1) <= 256 будет истинным; если это не так, остановите выполнение на этом этапе и прорвитесь в отладчик».

Метод взлома отладчика зависит от платформы и, вероятно, неправильно реализован для gcc.Я искал этот фрагмент кода в проекте, а затем попытался выяснить, почему c должен быть меньше или равен 255, и что заставляет его выходить за пределы диапазона;запуск программы до точки, где срабатывает утверждение, дает вам неявную точку останова для условия ошибки, начните с этого.

2 голосов
/ 30 января 2012

Я обнаружил, что причина проблемы в том, как каждый компилятор объявляет символ.В Visual Studio по умолчанию используется подписанный символ.Таким образом, каждый символ подписан, если вы явно не предшествуете его объявлению без знака.Таким образом, в VS диапазон символов составляет от -128 до 127, и если символ чтения имеет ASCII больше 128, он будет иметь отрицательный код в VS.И поскольку этот случай не обрабатывается в функциях isalpha, isdigit и т. Д., Функция не будет выполнена.В gcc используемая методология для установки знака или знака без знака - это что-то вроде динамического препроцессора.

1 голос
/ 09 февраля 2016

Вы стали жертвой неопределенного поведения в отношении неожиданного ввода функций <ctype.h>. В соответствии с разделом 7.4, параграф 1 стандарта C11 :

Во всех случаях аргументом является int, значение которого должно быть представлено как unsigned char или должно равняться значению макроса EOF. Если аргумент имеет любое другое значение, поведение не определено.

Другими словами, если x не находится в диапазоне [0..UCHAR_MAX] или EOF, вы не должны передавать его ни одной из функций <ctype.h>. Брошенное утверждение - довольно вежливый способ сообщить вам, что вы нарушили это правило; большинство из них просто допустили бы ужасные вещи (например, я могу себе представить жуткие ошибки).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...