Оригинальный DVD-ROM: eXeL@B DVD !
eXeL@B ВИДЕОКУРС !

ВИДЕОКУРС ВЗЛОМ
выпущен 2 июля!


УЗНАТЬ БОЛЬШЕ >>
Домой | Статьи | RAR-cтатьи | FAQ | Форум | Скачать | Видеокурс
Новичку | Ссылки | Программирование | Интервью | Архив | Связь

ПРОГРАММИРОВАНИЕ НА C и С++



Возможности языков семейства Си по истине безграничны, однако, в этой свободе кроются и недостатки: всегда нужно программисту держать ухо востро и контроллировать "переполнение буфера", чтобы потом программа не вылетала в "синий экран" на массе разнообразных версий Windows и железа у пользователей. Те же крэкеры и реверсеры специально ищут в коде программ на Си уязвимости, куда можно подсадить любой вирусный код, об этом более подробно автор рассказывал в своём видеокурсе здесь. Я там многое узнал и теперь мой код стал значительно более безопасный.
Debug против Release
A: (SUnteXx)
Оригинальная ссылка: Исходники.ru

В данной статье приведены различия Debug и Release версий программ... То есть, если программа в Debug версии работает хорошо и без ошибок, а в Release вылетает с ошибкой или без оной, то вы нарушили одно из нижеприведенных правил!


  • В релиз версиях обязательно надо обнулять структуры
  • Не забывать выделять память переменным
  • Проверять возвращаемое значение той или иной функции на ошибки
  • В MFC не забыть, что в релизе макросы ASSERT, ASSERT_VALID заменяются на пустое место
  • Всякие стандартные математические функции (sin, cos, ...) в debug и release версиях могут при одинаковых аргументах возвращать немного разные значения
  • В релизе есть оптимизация, которая ОЧЧЧЧЕНЬ редко добавляет баги в нормальный код
  • Пусть объявлены глобальная и локальная переменные c одинаковыми именами. Далее, пусть в какой-нибудь функции используется одна из них. Так вот в релизе компилер может решить, что использовать надо одну переменную, а в дебаге - другую
  • inline функции подставляются только в релизе
  • Дебаг и релиз версии msvcrt.dll отличаются, и если вдруг (при использовании длл) new делается в длл, а delete в приложении (или наоборот), то гарантированны проблемы, потому что способы выделения/удаления (в дебаг и релиз версиях рантайма) будут разные, явный признак подобной ошибки: ссылка на файл dbgheap.h/dbgheap.cpp, а дальше что нибудь типа error line 1044. Для этого необходимо что бы везде (и в длл, и в приложении) стояли одинаковые версии Runtime Library (есть много вариантов: мультитреадед дебаг/мультитреадед/... ) - главное что бы они были одинаковые.
  • inline функции подставляются только в релизе...
  • Чтобы проверить результат функции в debug-версии можно пользоваться макросом VERIFY, в код, переданный макросу, исполняется, только "debug assertion" не выбрасывается.
  • Еще, относительно inline-expantion. В release-версии могут быть раскрыты даже те методы, которые не помечены как inline (опция all suitable). Легко может привести к переполнению стека, если пользоваться макросами A2W, W2A и т.п., т.к. память, выделенная ими на стеке по alloca не будет вовремя освобождаться.
  • Фишка относительно __declspec(naked): в debug-версии даже для таких функций генерируется фрейм стека, так что, если это не учитывать, после вызова такой функции стек "поедет".
  • Опять же, из за оптимизации, могут по разному работать некоторые "зубодробительные" конструкции типа "cout << i ++ << ++ i << i ++"
  • В релиз-версии catch(...) не ловит SEH исключения
  • Дебаг-версия программы работает с минимумом необъяснимых глюков в том случае, если находится имеено в папке /debug. Так, например, если поток после выполнения некоторых действий сам себя вводит в состояние Suspend, а Release ему делает другой поток, то был замчен глюк: если дебаг-версия собирается в папке, отличной от /Debug, поток сам себя в Suspend не вводит, а продолжает выполнятся. Релиз работает нормально, если дебаг скопировать обратно в /Debug, то тоже все ок.



<< ВЕРНУТЬСЯ В ПОДРАЗДЕЛ

<< ВЕРНУТЬСЯ В ОГЛАВЛЕНИЕ




Материалы находятся на сайте https://exelab.ru/pro/



Оригинальный DVD-ROM: eXeL@B DVD !


Вы находитесь на EXELAB.rU
Проект ReactOS