Типы ошибок в программном обеспечении
Существуют три типа ошибок программирования: – синтаксические ошибки, – ошибки выполнения, – семантические ошибки. В любом языке программирования каждое предложение (оператор) строится по определенным правилам. Когда в программе встречается предложение, которое нарушает эти правила, то говорят о наличии синтаксической ошибки. Синтаксическая ошибка легко обнаруживается компиляторами и интерпретаторами языка и легко исправляется. Второй тип ошибок обычно возникает во время выполнения программы (их принято называть исключительными ситуациями). Такие ошибки имеют другую причину. Если в программе возникает исключение, то это означает, что случилось непредвиденное: например, программе передали некорректное значение или программа попыталась разделить какое-то значение на ноль, что недопустимо с точки зрения математики. Если операционная система присылает запрос на немедленное завершение программы, то также возникает исключение. Ошибки выполнения легко обнаруживаются, однако устранение их причин может оказаться нетривиальной задачей. Семантические (смысловые) ошибки – это применение операторов, которые не дают нужного эффекта (например, (a–b) вместо (a+b)), ошибка в структуре алгоритма, в логической взаимосвязи его частей, в применении алгоритма к тем данным, к которым он неприменим и т.д. Правила семантики не формализуемы. Поэтому поиск и устранение семантической ошибки и составляет основу отладки.
3.1.2. Причины появления ошибок в программном обеспечении
Прежде всего необходимо понять первопричины ошибок программного обеспечения и связать их с процессом создания программных комплексов. В данном учебном пособии считается, что создание программного обеспечения можно описать как ряд процессов перевода, начинающихся с постановки задачи и заканчивающихся большим набором подробных инструкций, управляющих ЭВМ при решении этой задачи. Создание программного обеспечения в этом случае – просто совокупность процессов трансляции, т.е. перевода исходной задачи в различные промежуточные решения, пока наконец не будет получен подробный набор машинных команд [1]. Когда не удается полно и точно перевести некоторое представление задачи или решения в другое, более детальное, тогда и возникают ошибки в программном обеспечении. Для того чтобы подробнее исследовать проблему ошибок в программном обеспечении (ПО), рассмотрим различные типы процессов перевода при его создании. Создание ПО начинается с формирования требований пользователя, т.е. с разработки описания решаемой задачи. Такое описание имеет вид перечня требований пользователя. В некоторых случаях пользователь составляет этот перечень сам. В других случаях это делает разработчик ПО в беседе с пользователем, либо исследуя его потребности, либо самостоятельно оценивая эти потребности в будущем, либо комбинируя перечисленные методы. В данном учебном пособии будем считать, что на данном этапе ошибки не вносятся. 1. Первый процесс – перевод требований пользователя в цели программы. Хотя на этом шаге объем перевода невелик, здесь требуется явно выделить и оценить довольно много компромиссных решений, которые будут рассмотрены в дальнейшем. Ошибки на этом шаге возникают, когда неверно интерпретируются требования, не удается выявить все требующие компромиссных решений проблемы или приняты неправильные решения, а также в случае, когда не сформулированы цели, необходимые, но не поставленные явно в требованиях пользователя. 2. Второй процесс связан с преобразованием целей программы в ее внешние спецификации, т.е. точное описание поведения всей системы с точки зрения пользователя. По объему перевода это самый сложный шаг в разработке ПО, поэтому он больше всего подвержен ошибкам – они бывают и наиболее серьезными и наиболее многочисленными. 3. Далее следуют несколько последовательных процессов перевода – от внешнего описания готового продукта до получения детального проекта, описывающего множество составляющих программу предложений, выполнение которых должно обеспечить поведение системы, соответствующее внешним спецификациям. Сюда включаются такие процессы, как перевод внешнего описания в структуру компонент программы (например, модулей) и перевод каждой из этих компонент в описание процедурных шагов (например, в блок-схемы). Поскольку нам приходится иметь дело со все большими объемами информации, шансы внесения ошибок становятся чрезвычайно высокими. 4. Последний процесс – перевод описания логики программы в предложения языка программирования. Хотя на этом шаге часто делается много ошибок, они обычно незначительные, легко обнаруживаются и корректируются. Кроме процессов перевода имеются и другие источники ошибок, которые будут кратко рассмотрены ниже. Однако в данном учебном пособии мы сосредоточимся на ошибках, возникающих в четырех вышеназванных процессах перевода. В результате работы над программным проектом возникают как само ПО, так и документы, описывающие правила пользования им. Последние обычно имеют вид печатных руководств или встроенной в программу помощи и носят название публикаций. Эти руководства обычно получаются переводом внешних спецификаций в материалы, ориентированные на конкретные группы пользователей. Публикации определенным образом влияют на надежность программного обеспечения. Если при их подготовке возникает ошибка, то они не будут точно описывать поведение программы. Если прочитав руководство, пользователь начнет работать с программой и обнаружит, что она ведет себя не так, как он ожидал, то решит, что это ошибка в программе, т.е. придет к неправильному заключению. Другие источники ошибок – это неправильное понимание спецификаций используемой в системе аппаратуры, базового ПО (операционной системы), синтаксиса и семантики языка программирования. И наконец, при непосредственном взаимодействии пользователя с ПО, если слабо разработан диалог человек – машина (отсутствие «дружественного интерфейса»), вероятность ошибки пользователя увеличивается. Ошибки пользователя же ставят систему в новые, непредвиденные обстоятельства, увеличивая таким образом шансы проявления оставшихся в программе ошибок. Эта модель описывает происхождение большинства ошибок в ПО. Нередко считается, что ошибки в программе – это те ошибки, которые делает программист, когда пишет программу на языке программирования. Здесь и проявляется важность модели, поскольку она более полно описывает причины, лежащие в основе ненадежности. Благодаря ей нам стал известен перечень подлежащих решению задач, способствующих созданию надежного ПО.
Какие типы ошибок могут возникнуть в программе?
1. Логические. Когда ошибки в алгоритме, например, те действия, которые можно выполнить одной операцией, выполняются излишними функциями. Работать такая программа будет, но затрачивает больше вычислительных ресурсов.
2. Синтаксические. Когда ошибки в написании кода, например, ошибочно указано имя функции, переменной, или передано в функцию недостаточное количество аргументов, не проставлен знак пунктуации в необходимом месте. Работать такая программа определенно не будет.
3. Ошибки в процессе выполнения. Когда ошибка возникает во время выполнения программы, например, нехватка системных ресурсов (памяти), или зацикленность программы.
5 Нравится Комментировать
Лучший ответ выбран модератором
Другие ответы (5)
- Букет
- 3. Исследователь (275)
- 5 лет
Пользователь
Ну что ж, если вы начинающий программист, и хотите создать свою программу, вам необходимо знать о трех самых распространенных ошибках, которые могут возникнуть во время процесса создания. Итак, самой первой является синтаксическая ошибка. С языковых курсов, да и со школы, вы должны знать, что синтаксические ошибки возникают при неверном построении словосочетаний. В нашем случае это ошибки совершенные в ходе написания структуры кода. Следующее нарушение – ошибки времени выполнения (Runtime errors). Такие неисправности возникают уже в ходе работы программы. Причиной чаще всего являются неверные исходные данные.Их лучше конечно заметить и решить до его запуска. И последний тип – логические ошибки. По-другому их еще называют – баг. Он зачастую приводит к некорректной работе программы. Они могут появляться в компиляторах и интерпретаторах.
4 Нравится Комментировать
- Mega
- 10. Мудрец (4785)
- 5 лет
Пользователь
Например, могут быть логические ошибки, это когда у кода непродуманный алгоритм, также бывают синтаксические ошибки, самый распространенный тип ошибок, например когда неверно указано имя функции, неправильно расставлены знаки пунктуации, не указаны все обязательные параметры функции и т.д.
1 Нравится Комментировать
- Юра
- 22. Сверхразум (82354)
- 1 год
Виды ошибок в программах
Я учусь на своих ошибках. Ругаю себя за это, но продолжаю ошибаться. С другой стороны — это всё-таки лучше, чем не учиться совсем, и наступать на одни и те же грабли бесконечно.
При создании программ, даже простых, ошибки неизбежны. Поэтому для поиска ошибок во всех средствах разработки имеются особые инструменты для отладки. Но сегодня не об отладке и не о поиске ошибок. Сегодня о видах ошибок, которые встречаются в программах.
Итак, основных вида всего три:
- Синтаксические ошибки
- Логические ошибки
- Ошибки выполнения программы
Синтаксические ошибки в программах
Эти ошибки довольно распространены, особенно среди начинающих. Но эти ошибки — самые безобидные. Потому что компиляторы легко находят ошибки синтаксиса и указывают место в исходном коде, где обнаружена такая ошибка. Программисту остаётся только исправить её.
Синтаксические ошибки — это ошибки синтаксиса (а то бы вы не догадались))). То есть ошибки правил языка. Например, для Паскаля это будет синтаксической ошибкой:
Потому что после первой строки нет точки с запятой.
Подобные ошибки очень часто совершают новички. И это вгоняет их в ступор — они пугаются и не могут понять, что же не так с их кодом. Хотя если бы они внимательно его посмотрели и прочитали сообщение об ошибке, то легко могли бы исправить её:
Потому что в сообщении чётко сказано:
Syntax error, ";" expected but "identifier READLN" found
что можно перевести как
синтаксическая ошибка, ";" ожидалось, но "READLN" найден
То есть компилятор говорит нам: я ожидал увидеть точку с запятой, а нашёл идентификатор READLN .
Логические ошибки в программах
Это самые противные и самые труднонаходимые ошибки. Программа может быть написана совершенно правильно с точки зрения синтаксиса языка, и при этом она будет неправильно работать. Потому что программист допустил где-то логическую ошибку.
И компилятор вам ничего об этой ошибке не расскажет, потому что правила языка не нарушены.
Поиски таких ошибок могут занять много времени и отнять у вас немало здоровья. Поэтому при разработке программ лучше не торопиться и стараться не допускать логических ошибок.
Пример логической ошибки:
for i := 1 to 10 do if i = 15 then WriteLn('i = 15');
Здесь мы сравниваем значение i с числом 15, и выводим сообщение, если i = 15 . Но фишка в том, что в данном цикле i не будет равно 15 НИКОГДА, потому что в цикле переменной i присваиваются значения от 1 до 10.
Эта ошибка довольно безобидная. Здесь мы имеем просто бессмысленный код, который не причинит никакого вреда. Однако представьте, что программа должна выдавать какой-то сигнал тревоги, если i = 15 . Тогда получится, что никакого сигнала пользователь никогда не услышит, даже если случилось что-то страшное. А всё потому, что программист немного ошибся. Вот так вот и падают ракеты и самолёты…
Распространённые логические ошибки в С++ вы можете посмотреть здесь.
Ошибки времени выполнения программы
Даже если исходный код не содержит ни логических, не синтаксических ошибок, это ещё не означает, что ваша программа безупречна. Потому что ошибки могут возникнуть в ходе выполнения программы. Например, случайно будет удалён файл, который должна читать программа, и она не сможет его найти. Если не принять мер, то программа может завершиться аварийно. А пользователям такое поведение программ очень не нравится.
Одна из самых рапространённых ошибок времени выполнения — это неожиданное деление на ноль. Пример:
Write('y = '); ReadLn(y); x := 100 / y; WriteLn('100 / ', y, ' = ', x);
Что здесь такого? Всё правильно и с точки зрения логики, и с точки зрения синтаксиса. И в большинстве случаев программа отработает без каких-либо неожиданностей.
Но представьте, что пользователь введёт ноль. Что тогда будет? Правильно — попытка деления на ноль. А на ноль делить нельзя. Поэтому во время выполнения этой программы произойдёт ошибка, которая очень расстроит пользователя. Потому что в случае, например, с консольным приложением программа просто закроется, и пользователь не поймёт, что это было. Но зато поймёт, что программа — говно, и программы от этого разработчика лучше больше никогда не использовать.
В данном случае, если вы не уверены на 100%, что y будет отличаться от нуля, надо всегда делать проверку на ноль. И хороший код должен быть хотя бы таким:
Write('y = '); ReadLn(y); if y = 0 then WriteLn('ERROR: y = 0') else begin x := 100 / y; WriteLn('100 / ', y, ' = ', x); end;
Ну что же. На этом с видами ошибок пока всё. Изучайте программирование и поменьше ошибайтесь.
Основы программирования Каждый профессионал когда-то был чайником. Наверняка вам знакомо состояние, когда “не знаешь как начать думать, чтобы до такого додуматься”. Наверняка вы сталкивались с ситуацией, когда вы просто не знаете, с чего начать. Эта книга ориентирована как раз на таких людей, кто хотел бы стать программистом, но совершенно не знает, как начать этот путь. Подробнее. |
#4 – Что такое баги? Как отследить ошибку?
Самое плохое что может увидеть программист в своей программе – баг, а еще хуже – баги. В уроке мы поговорим про ошибки, какие они бывают, когда возникают и главное как с ними можно бороться.
Відеоурок
Підписуйтесь на нашу групу в Телеграм
Какие бывают ошибки?
Сразу проясним. В программировани ошибки называют багами. Одна ошибка – один баг.
При написании программ у вас могут возникнуть баги, что разделяются за следующими категориями:
- логические
- арифметические
- синтаксические
- ошибки компиляции
- ошибки среды выполнения
- ошибки ресурса
- ошибки взаимодействия
Логические ошибки никак не отображаются при построении проекта. Они заключаются в логической промашке выполнения программы. Пример: программа должна вывести число 5, а выводит число 3. Программы выполнилась, но результат не тот что вы ожидали. Такая ошибка может получиться в случае если вы в коде прописали что-то не так. В нашем случае вместо числа 5 написали число 3, поэтому программа сработало, но при этом результат не тот что ожидали. К сожалению, такие ошибки нужно искать в ручном режиме, просматривая строчки написанной вами программы.
Арифметическая ошибка связана с вычислением. Самая частая ошибка такого плана – деление на ноль. Это сделать нельзя и программа выдаст вам ошибку, что квалифицируется как Арифметическая ошибка. Помимо деления на ноль могут быть и другие ошибки связанные с математикой.
Синтаксическая ошибка связана с неверным написанием синтаксисам языка. Каждый язык: C, Java, PHP и другие – имеют специфический синтаксис, в котором будет написан код. Если вы пропустили какой-то необходимый символ при создании какой-либо конструкции в коде, то будет вызвана такая ошибка. Это наиболее простой тип ошибки, так как обычно сама IDE подсказывает что у вас есть такая-то ошибка.
Ошибки могут появляться на моменте сборки проекта и на моменте его запуска. Есть ошибки компиляции, которые возникают в процессе преобразования программы в машинный код. Многие виды ошибок могут происходить на этом этапе, в том числе и синтаксические ошибки. Тут проверяется не только синтаксис программы, но и его логическое выполнение.
Ошибки среды выполнения возникают в момент тестировании программы. Вы ее запустили, работаете в ней и в какой-то момент программа завершается. Думаем вы ни раз такое наблюдали в разных программах. Такое происходит зачастую из-за неверной работы с памятью компьютера. К примеру, можно запустить какую-то задачу на постоянное выполнение. Отведенная память будет перегружена и программа выдаст ошибку. Или же можно в программе попробовать скачать файл с интернета, не убедившись перед этим есть ли доступ к интернету. Если не будет доступа, то программа просто не сможет это сделать и так же выдаст ошибку. Таких примеров сотни и все они будут видны только при тестировании проекта.
Ошибка ресурса возникает, когда значение переменной переполняет максимально допустимое значение. Про переменные мы еще с вами поговорим, а сейчас просто представьте банку, в которую вы вливаете воду. В момент когда вы начнете вливать слишком много воды и она начнет выливаться будет вызвана ошибка ресурсов.
И наконец, ошибки взаимодействия. Они могут возникнуть в связи с несоответствием программного обеспечения с аппаратным интерфейсом. К примеру, вы делали игру под Андроид, а пробуете запустить под iOS.
Как найти ошибку?
В зависимости от типа ошибки способ их отлова будет разным. Если вы работаете внутри IDE, то большинство мелких ошибок будут подсвечены еще на момент написания кода. К примеру, если вы не укажите какой-то символ или начнете выполнять деление на ноль, то программа вам об этом подскажет и попросит исправить ошибку.
Если будет ошибка при построении, то программа не запустится, а в самой IDE будет указан текст ошибки. Такой текст можно загуглить и после найти решение.
Если ошибка логическая или ошибка среды выполнения, то вы сможете ее обнаружить только после запуска проекта. Вы компилируете проект, он у вас запускается и далее вы выполняете действия в вашей программе. Если на каком-то этапе будет ошибка, то программа остановиться и вам нужно будет искать ошибку самостоятельно в коде программы.
Поиск ошибок никогда не был удобным и тем более приятным. На то они и ошибки, чтобы портить, так сказать, жизнь. Вам в будущем нужно просто много раз запускать проект, смотреть на его выполнения на разных стадиях построения проекта и тем самым вы шаг за шагом построите нужное вам приложение.
Завдання до уроку
Вопросы на проверку
Ответьте на несколько вопросов:
- расскажите какие ошибки бывают? Назовите хотя бы три вида ошибок.
- как справиться с ошибкой?