Как найти ошибку в коде c
Перейти к содержимому

Как найти ошибку в коде c

  • автор:

Найти ошибку в коде С++

Помогите пожалуйста найти ошибку в коде, после компиляции и вывода массива на экран — программа зависает и закрывается.

#include "stdafx.h" #include "conio.h" #include #include #include "stdio.h" int _tmain(int argc, _TCHAR* argv[]) < setlocale(LC_ALL, "Rus"); int n, m, i, j, flag, dop, g; printf("Введите размер матрицы\n"); scanf_s("%d %d", &n, &m); int **A; A = (int**)malloc(sizeof(int*)*n); for (i = 0; i> g = m; for (i = 1; i A[i][j + 1]) < dop = A[i][j]; A[i][j] = A[i][j + 1]; A[i][j + 1] = dop; flag = 0; >> > while (flag == 1); > for (i = 2; i > > while (flag == 1); > return 0; > 

Отслеживать

44.8k 3 3 золотых знака 39 39 серебряных знаков 90 90 бронзовых знаков

задан 10 дек 2016 в 15:04

515 1 1 золотой знак 5 5 серебряных знаков 19 19 бронзовых знаков

Игра: найди ошибку в C++ коде

Игра PVS-Studio: найди ошибку в C++ коде

Авторы анализатора PVS-Studio предлагают вам проверить свою внимательность и развлечься. Попробуйте быстро отыскать баг в фрагменте исходного кода и ткнуть в него мышкой.

Анализаторы кода работают без устали и умеют находить множество ошибок, которые сложно заметить. Мы отобрали несколько фрагментов кода, в которых выявили ошибки с помощью PVS-Studio. Все фрагменты взяты из известных Open Source проектов.

Предлагаем вам посоревноваться с анализатором в прозорливости и попробовать самостоятельно найти ошибки. Вам будет предложено 10 случайно выбранных заданий. За верный ответ начисляется одно очко, если баг найден в течение 1 минуты.

Ограничение в 1 минуту сделано для интереса. Иначе вы, скорее всего, верно найдёте и укажете каждую ошибку, так как фрагменты кода короткие. В любом случае относитесь к этому просто как к игре, а не как к настоящему тестированию программистских навыков у вас или ваших коллег 🙂

Когда нашли ошибку, выделите её кликом мышки и нажмите кнопку «Ответ». Бывает, что в коде есть сразу несколько мест, куда вы можете «ткнуть» — и ответ зачтётся как правильный. Поясним это на примере.

case FuriHalSubGhzPreset2FSKDev476Async: preset_name = "FuriHalSubGhzPreset2FSKDev476Async"; break; FURI_LOG_E(SUBGHZ_PARSER_TAG, "Unknown preset"); default:

Этот код взят из проекта FlipperZero. Анализатор PVS-Studio сообщает, что часть кода никогда не выполняется: V779 [CWE-561, CERT-MSC12-C] Unreachable code detected. It is possible that an error is present. subghz_i.c 44

Кто-то поспешил и использовал макрос логирования после оператора break. Или это следствие неудачного рефакторинга. В любом случае ошибка очевидна, но вот куда именно ткнуть мышкой – вопрос сложнее.

С одной стороны, в качестве ответа можно выбрать оператор break. Он расположен до макроса FURI_LOG_E и прерывает выполнение оператора switch. Значит, проблема здесь.

С другой стороны, можно выбрать макрос логирования. Ведь это недостижимый код.

Так как же быть? Очень просто. В данном случае правильным ответом будет считаться как выделенный оператор break, так и макрос FURI_LOG_E.

Думаем, правила понятны. Желаем вам удачи: начать игру.

Не забудьте, показать этот Quiz вашим коллегам! Развлекайтесь, и безбажного вам кода!

Если хотите поделиться этой статьей с англоязычной аудиторией, то прошу использовать ссылку на перевод: Andrey Karpov. PVS-Studio’s challenge: can you spot an error?.

Как найти ошибку в коде c

rui_er → Codeforces Round 942 (Div. 1, Div. 2)

Haidora → A general approach to solve subree distinct values queries!

SashaT9 → Codeforces Round 943 (Div. 3)

EnDeRBeaT → [Tool] Graph Debugger

rui_er → Codeforces Round 942 (Div. 1, Div. 2) Editorial

awoo → Разбор Educational Codeforces Round 165

Abito → Who’s going to IIOT 2024?

Некропост

dv.jakhar_ → How to solve this problem, any ideas?

gareeeeeeeeeeeeeeeev → Релиз версии бот 1.2

Zanite → [Photos Dump] Jollybee CP Team, the Luxor WF, and the Indomie Aftermath

wuhudsm → TheForces Round #30 (Good-Forces) Editorial

Некропост

Igor_Kudryashov → Разбор задач Coder-Strike 2014 Финал

h ehezhou → 2024-The 6th Turing Cup Tournament

Некропост

MikeMirzayanov → Изменение правил об использовании стороннего кода в соревнованиях Codeforces

transfermarket → Report cheater obfuscate code

Asuna_Yuuki → MEME

Loserinlife → Need help

Некропост

Sharon → Who is going to UCF Saturday Practice — November 2nd, 2019 ?

Cipesta. → Beyond CP: What’s Next

tickbird → Been stuck at green almost a year

123gjweq2 → Can someone please help me?

Некропост

Monogon → Codeforces Round #639 Editorial

Некропост

Vladosiya → Codeforces Round 863 (Div. 3) Разбор

MofK → Codeforces Global Round 25 Editorial

Kolyanchick → До скорых встреч

Блог пользователя dmkz

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

Автор dmkz, история, 4 года назад ,

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

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

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

-Wall -Wextra -pedantic -std=c++17 -O3 -Wshadow -Wformat=2 -Wfloat-equal -Wconversion -Wlogical-op -Wshift-overflow=2 -Wduplicated-cond -Wcast-qual -Wcast-align -D_GLIBCXX_DEBUG -D_GLIBCXX_DEBUG_PEDANTIC 

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

Проверка переполнения

#include int main() < int a, b; std::cin >> a >> b; std::cout

Для теста 10000000 10000000 вы увидите следующее runtime error: signed integer overflow: 10000000 * 10000000 cannot be represented in type ‘int’

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

#include int main() < int arr[10]; int n; std::cin >> n; for (int i = 0; i < n; i++) < std::cin >> arr[i]; > > 

Для теста: 11 0 1 2 3 4 5 6 7 8 9 0 вы увидите следующее ==3752==ERROR: AddressSanitizer: stack-buffer-overflow on address 0x1126fd98 at pc 0x00cb1d97 bp 0x1126fb34 sp 0x1126fb30 WRITE of size 4 at 0x1126fd98 thread T0 #0 0xcb1d96 in std::bas. Ошибка исполнения, код возврата 1

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

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

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

Выход за пределы вектора

#define _GLIBCXX_DEBUG 1 #define _GLIBCXX_DEBUG_PEDANTIC 1 #define _FORTIFY_SOURCE 2 #include int main() < std::vectorarr(3,1); std::cout

В данном примере, при запуске обнаружится ошибка, и стандартная библиотека нам явно сообщит, что произошло не так:

Error: attempt to subscript container with out-of-bounds index 3, but container only holds 3 elements. 

Разыменование удаленного итератора

#define _GLIBCXX_DEBUG 1 #define _GLIBCXX_DEBUG_PEDANTIC 1 #define _FORTIFY_SOURCE 2 #include int main() < std::setset; auto it = set.begin(); set.erase(set.begin()); std::cout

Здесь мы сохраняем итератор, затем удаляем его из сета, а затем попытаемся разыменовать удаленный итератор: возникает ошибка:

Error: attempt to dereference a singular iterator. 

Слияние неотсортированных списков

#define _GLIBCXX_DEBUG 1 #define _GLIBCXX_DEBUG_PEDANTIC 1 #define _FORTIFY_SOURCE 2 #include #define all(x) (x).begin(),(x).end() using vi = std::vector; int main() < vi left = ; vi right = ; vi res; std::merge(all(left), all(right), std::back_inserter(res)); > 

Здесь мы используем стандартный алгоритм, который сливает два отсортированных массива в один линейно. Этот алгоритм подразумевает, что оба массива отсортированы, но мы допустили ошибку и не отсортировали второй массив. Увидим следующее:

Error: elements in iterator range [__first2, __last2) are not sorted. 

Неожиданное динамическое расширение вектора

#define _GLIBCXX_DEBUG 1 #define _GLIBCXX_DEBUG_PEDANTIC 1 #define _FORTIFY_SOURCE 2 #include #define all(x) (x).begin(),(x).end() using vi = std::vector; int main() < vi arr; auto ptr = arr.begin(); arr.push_back(5); std::cout

Сохраняем итератор на начало вектора, а затем добавляем в конец еще один элемент. Происходит ресайз вектора, выделение новой памяти и вся старая память копируется в новое место, и очищается, поэтому итератор начинает указывать на удаленную память, и стандартная библиотека нам об этом сообщает:

Error: attempt to dereference a singular iterator. 

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

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

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

#include #include // для assert int main() < int a, b; std::cin >> a >> b; // вычисляем разность int c = a - b; // проверяем, что c + b == a - самопроверка assert(c + b == a); std::cout  

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

#include #include // для assert int f(int n) < // проверяем, что аргумент функции ВСЕГДА НЕОТРИЦАТЕЛЕН: assert(n >= 0); if (n == 0) return 1; return n * f(n - 1); > int main() < int n; std::cin >> n; std::cout  

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

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

Как найти ошибку в C/C++ коде? Видимо где-то забыл ; или " или >

Весь день бъюсь над компиляцией программы. Перед этим два дня делал ей кардинальную переделку (без промежуточных компиляций). В результате, сейчас не могу скомпилить.

Проблема в том, что компилятор gcc, в случае забывчивости программиста поставить ; или " или >, обычно не показывает то место, где эта ошибка произошла, и догадываться приходится по коственным признакам.

Вот сейчас у меня такая же ситуация. Я столько кода наменял, что вспомнить, где надо перепроверить, нет возможности. А скомпилить не могу, из-за неизвестного места, в котором есть проблема.

Что делать? Слышал, вроде есть какие-то дополнительные анализаторы кода, но те что я нашел - это для аудита безопасности кода.

Вот вывод ошибок

src/treeitem.h:75: ошибка: ISO C++ запрещает декларации 'recordtabledata' без типа
src/treeitem.h:75: ошибка: expected ';' before '*' token
src/treeitem.h:89: ошибка: 'recordtabledata' does not name a type
src/recordtablemodel.h:38: ошибка: 'recordtabledata' не был декларирован
src/recordtablemodel.h:43: ошибка: ISO C++ запрещает декларации 'recordtabledata' без типа
src/recordtablemodel.h:43: ошибка: expected ';' before '*' token
src/recordtablescreen.h:35: ошибка: 'recordtabledata' не был декларирован
src/recordtablescreen.h:125: ошибка: ISO C++ запрещает декларации 'recordtabledata' без типа
src/recordtablescreen.h:125: ошибка: expected ';' before '*' token

src/recordtablescreen.cpp:173: ошибка: prototype for 'void recordtablescreen::set_tabledata(recordtabledata*)' does not match any in class 'recordtablescreen'
src/recordtablescreen.h:35: ошибка: претендент: void recordtablescreen::set_tabledata(int*)

src/recordtablescreen.cpp:173: предупреждение: unused parameter 'rtdata'

src/recordtablescreen.cpp: In member function 'void recordtablescreen::select(const QModelIndex&)':
src/recordtablescreen.cpp:217: ошибка: нет декларации 'table' в этой области видимости
src/recordtablescreen.cpp: In member function 'void recordtablescreen::add_new(int, QString, QString, QString, QString, QString)':
src/recordtablescreen.cpp:312: ошибка: нет декларации 'table' в этой области видимости
src/recordtablescreen.cpp: In member function 'void recordtablescreen::edit_field_context()':
src/recordtablescreen.cpp:341: ошибка: нет декларации 'table' в этой области видимости
src/recordtablescreen.cpp: In member function 'void recordtablescreen::edit_field(int, QString, QString, QString, QString)':
src/recordtablescreen.cpp:373: ошибка: нет декларации 'table' в этой области видимости
src/recordtablescreen.cpp: In member function 'void recordtablescreen::delete_records()':
src/recordtablescreen.cpp:426: ошибка: нет декларации 'table' в этой области видимости
src/recordtablescreen.cpp: In member function 'void recordtablescreen::copy()':
src/recordtablescreen.cpp:459: ошибка: нет декларации 'table' в этой области видимости
src/recordtablescreen.cpp: In member function 'void recordtablescreen::moveup()':
src/recordtablescreen.cpp:642: ошибка: нет декларации 'table' в этой области видимости
src/recordtablescreen.cpp: In member function 'void recordtablescreen::movedn()':
src/recordtablescreen.cpp:662: ошибка: нет декларации 'table' в этой области видимости

По какой-то причине невозможна работа с классом recordtabledata. Обычно такие ошибки возникают, если забыть подключить заголовок recordtabledata.h через include, или в прототипе класса забыть за закрывающей скобкой поставить ; . Везде где нужно (и ненужно) заголовок подключен. В pro файле (использую Qt)в HEADERS и SOURCES добавлены recordtabledata.h и recordtabledata.cpp соответсвенно.

Обращаю внимание на странную ошибку

". prototype for 'void recordtablescreen::set_tabledata(recordtabledata*)' does not match any in class 'recordtablescreen'
src/recordtablescreen.h:35: ошибка: претендент: void recordtablescreen::set_tabledata(int*) . "

Претендента set_tabledata(int*) у меня нигде на самом деле в коде нет, а есть

Прототип в классе recordtablescreen (файл recordtablescreen.h)
void set_tabledata(recordtabledata *);

Реализация (файл recordtablescreen.cpp)
void recordtablescreen::set_tabledata(recordtabledata *rtdata)
<
.
>

Поток ошибок с table связано с тем, что член класса table имеет тип recordtabledata.

В общем, все указывает на проблему в классе recordtabledata. Я его излазил вдоль и поперек, ошибки не вижу. Но почему-то с ним происходят вот такие странные вещи. И почему-то в нем компилятор ошибок не обнаруживает.

Вопрос. Что делать, как найти ошибку?

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *