Быстрый поиск глупых ошибок на C++ кратко и с примерами

Revision ru2, by dmkozyrev, 2020-02-18 19:24:41

Чтобы найти ошибку в коде нужно просто...

$$$\text{ }$$$

Первым делом нужно проверить переполнения типов данных, ошибки вроде = вместо ==, то, что вы записываете значение long long в переменную int, и многое другое. Предупредить возникновение некоторых глупых ошибок можно включением всех предупреждений компилятора. Экстренно проверить код можно по этой ссылке, там есть примеры. Необходимо заменить код из примера на свой код, дождаться компиляции и пофиксить все проблемные места. Предупреждения не являются ошибками, но могут ими все-таки быть из-за невнимательности.

Описание предупреждений есть тут.

Список использованных предупреждений

Затем можно протестировать свое решение при запуске на codeforces. Для этого в меню соревнования нужно нажать Запуск, откроется меню запуска, затем вставить свой код и проверить его на нескольких маленьких тестах при помощи компилятора Clang++17 Diagnostics.

Проверка переполнения
Проверка выхода за пределы массива или вектора

Затем с помощью компилятора GNU G++ можно перевести стандартную библиотеку в режим дебагга следующими макросами:

#define _GLIBCXX_DEBUG 1
#define _GLIBCXX_DEBUG_PEDANTIC 1
#define _FORTIFY_SOURCE 2

И, опять же, позапускать на различных тестах. Смотрите примеры.

Выход за пределы вектора
Разыменование удаленного итератора
Слияние неотсортированных списков
Неожиданное динамическое расширение вектора

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

Используйте assert(условие); для проверки инвариантов. Если условие ложно, то программа завершится с вердиктом "Ошибка исполнения". Это поможет в программах на 50-100 строк проверять самого себя.

Пример использования assert 1
Пример использования assert 2

Затем идет метод пристального взгляда, когда вы пытаетесь определить, что пошло не так, внимательно читая то, что вы написали, и перепроверяя. Для этих моментов полезно писать простой и легко читаемый код.

Следующие макросы помогут эффективно выводить в консоль переменные с их названиями и значениями, контейнеры вроде std::vector<X> и std::set<X>, а также пары значений вида std::pair<X,Y>.

Рекомендуется прочитать этот блог по поиску ошибок в GCC C++.

History

 
 
 
 
Revisions
 
 
  Rev. Lang. By When Δ Comment
en2 English dmkozyrev 2020-02-21 11:04:57 10 Tiny change: 'deone.com/otq76E) will hel' -> 'deone.com/r7gCgv) will hel'
en1 English dmkozyrev 2020-02-21 11:00:11 7243 Initial revision for English translation
ru3 Russian dmkozyrev 2020-02-18 19:28:50 49
ru2 Russian dmkozyrev 2020-02-18 19:24:41 41
ru1 Russian dmkozyrev 2020-02-18 19:18:23 6919 Первая редакция (опубликовано)