Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
лекции.doc
Скачиваний:
2
Добавлен:
01.05.2025
Размер:
392.19 Кб
Скачать

Отладка и сопровождение пп. Ошибки по: причины, источники, классификация

Любой процессор может выполнять только специально предназначенные для него программы. Они состоят из команд этого процессора. Внешне такая программа представляет собой последовательность 0 и 1, т.е. двоичных кодов.

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

Существует два принципиально различных метода трансляций. Один из них предполагает перевод всей программы на машинный язык, т.е. в двоичные коды, затем ее исполнение. Этот метод называется компиляцией. Он весьма эффективен в том смысле, что перевод делается быстро, машинную программу можно сохранить и пользоваться ею неоднократно. Компиляцию применяют в тех случаях, когда необходимо быстрое и неоднократное исполнение программы. Такие требования обычны для задач математики, физики, экономики, бухучета и т.п.

Другой подход называется интерпретацией. Он состоит в переводе и немедленном исполнении каждого оператора исходной программы. Но такие программы исполняются медленнее. Интерпретация позволяет решать более сложные задачи, связанные, например, с созданием искусственного интеллекта: систем видящих, слышащих, умеющих накапливать знания и устанавливать различные связи между ними; систем, приспосабливающихся к меняющемуся окружению, систем, имитирующих умственную деятельность человека, систем, способных вести обучение человека. В процессе трансляции осуществляется контроль текста программы, который состоит в проверке входной программы на соответствие некоторым формальным правилам.

Контроль текста подразделяется на лексический, синтаксический и семантический.

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

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

Задачей семантического контроля является проверка правильности применения конструкций в конкретной записи. Для языков, в которые включены описания переменных, семантический контроль проверяет допустимость применения в операторах переменных с заданными в их описании характеристиками (тип, размерность). Например, выявление выхода текущих значений индекса за указанные в описании пределы, соответствие числа фактических параметров к числу формальных.

Перевод программы на машинный язык это еще не все. Процесс ее исполнения нуждается в контроле и поддержке. Характерными ситуациями являются попытки деления на 0, появление, выходящих за машинные возможности, больших или маленьких чисел. Эти ситуации обычно вызываются ошибками в программах, которые могут привести к совершенно непредвиденному поведению машины. При этом любая программа требует для своей работы наличие часто встречающихся программ. Например, вычисление элементарных функций, преобразование чисел из двоичного в десятичное представление и т.д. кроме того, программы используют некоторое количество ОЗУ, причем требуемый объем ее может меняться при исполнении и заранее невозможно предусмотреть, сколько ее понадобиться. Все эти функции обеспечиваются специальными программами.

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

Для проведения отладки программы разрабатывается контрольный пример, который на основе конкретных допустимых исходных данных рассчитывают «вручную», и принимают за эталон. Контрольный пример по возможности должен содержать всевозможные варианты и ситуации; обработку, которая предусмотрена в программе. Затем приступают к отладке программы, используя те же исходные данные, что и для контрольного примера. Получаемые значения результатов сравнивают с эталоном. Отладку ведут до тех пор, пока значения выходных данных, полученных на ЭВМ и эталон будут отличаться.

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

Наиболее распространенные ошибки

Основное внимание в программировании уделяется защите программ от неверных данных, но даже при правильных данных нет гарантии, что программа будет работоспособной. Рассмотрим алгоритм вычисления sin(x)=

1. Из блок-схемы видно, что переменной Summ не было присвоено никакого значения. Поэтому в начальный момент значение этой переменной было произвольным и, как это происходит в большинстве систем, с каждым последующим обращением в ней накапливается еще больше «мусора».

Замечание. Перед использованием программы необходимо убедиться в том, что всем п6ременным присвоены начальные значения.

2. Предположим, что ввод х стандартное, тогда и t будет отрицательным, поэтому условие в блоке 5 будет истинным и будет иметь место немедленный выход из программы с выдачей неправильного результата, поэтому условие (5) нужно заменить на t<0/

3. В выражении (-1 ), используемом для перемены знака, у членов ряда имеется ошибка и в такой записи его значение всегда будет (-1), поэтому для устранения ошибки надо использовать дополнительные скобки (-1) .

Распространенным случаем ошибок являются ошибки типа «невпопад». К ним относятся, например, неправильное использование операций отношения, например, использование < вместо ≤, как требуется на самом деле.

Т.о., чтобы избежать наиболее распространенных ошибок, в программе необходимо:

1. присваивать начальные значения переменным перед тем, как они будут использоваться.

2. Быть внимательными к ошибкам типа «невпопад». Убедиться в том, что необходимые действия выполняются нужное число раз и что проверки на сравнение ветвятся правильно при достижении граничных значений.

3. Проверять, чтобы индексы при обращении к элементам массива не выходили за границы.

4. Избегать циклов с несколькими выходами из них. Для этого объединять проверки условий выхода из цикла и помещать их к его началу

5. Проверять могут ли циклы в программе при определенных обстоятельствах выполняться нулевое число раз.

6. Не использовать числа с плавающей «,» в качестве значений счетчиков (т.к. для дробных величин с плавающей запятой не всегда справедливы известные правила арифметики).

Испытания программных продуктов

После того, как все программы разрабатываемого комплекса программ отлажены, приступают к следующему этапу – испытанию (опытной эксплуатации) комплекса программ.

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

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

Защитное программирование применяется для повышения надежности ПП при программировании в более широком смысле.

Как утверждает один из специалистов в области программирования Маекс: «Защитное программирование основано на важной предпосылке – «худшее, что может сделать программа – это принять неправильные входные данные, а затем вернуть неверный, но правдоподобный результат». Для того, чтобы этого избежать, в текст программы необходимо включать в блоки проверки входных и выходных данных на их корректность. Кроме этого, в программу можно включать обработчики соответствующих исключительных ситуаций, которые кроме выдачи необходимых сообщений могут принять меры, либо по ослаблению влияния ошибки (например, мягкую остановку управляемых программой устройств во избежание их поломки при аварийном прекращении выполнения программы).

Применение защитного программирования приводит к снижению эффективности программного продукта, как во времени, так и по используемой памяти. Поэтому необходимо разумно регулировать степень применения защитного программирования в зависимости от требований к надежности и эффективности ПП.

Различают следующие виды защиты ПП от искажения информации:

  • Защита от сбоев аппаратуры

  • От влияния «чужой» программы

  • От отказов своей программы

  • От несанкционированного доступа

  • Защита от защит.

Это обеспечивается организацией т.н. 2-3-х просчетов. После 1-го просчета вычисляется и запоминается некоторая контрольная сумма. После 2-го просчета снова вычисляется та же контрольная сумма, которая затем сравнивается с контрольной суммой 1-го просчета. Если эти две суммы совпадают, то 2-й просчет считается правильным. В противном случае, контрольная сумма 2-го просчета так же запоминается и производится 3-й просчет.

Защита от взлома защиты связана с использованием в ПП спец.программистских приемов, затрудняющих преодоление защиты от несанкционированного доступа. Использование обычных паролей оказывается недостаточным, когда речь идет о чрезвычайно настойчивом стремлении (например, преступного характера) добиться доступа к ценной информации.

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

Во-вторых, используя компьютеры, можно осуществить большой перебор возможных паролей с целью найти подходящий для доступа к интересующей информации. Защититься от такого взлома можно следующим образом: пароль знает только владелец, защищаемой информации, а для проверки прав доступа, в компьютере хранится др. число y=f(x), где х – пароль однозначно вычисляемое ПП при предъявлении пароля. При этом функция f может быть хорошо известный всем пользователям ПП, но она обладает таким свойством, что восстановление слова х по у практически невозможно (при достаточно большой длине слова х, например, в несколько сотен знаков для этого требуется астрономическое время). Такое число у называется электронной подписью владельца пароля х.

Другая разновидность такой защиты связана с защитой сообщений, пересылаемых по компьютерным сетям, от преднамеренных или злонамеренных исканий. Такое сообщение может перехватываться на перевалочных пунктах компьютерной сети и подменяться другими сообщениями от автора перехваченного сообщения. Такая ситуация возникает при осуществлении банковских операций с использованием компьютерной сети. Путем подмены такого сообщения является распоряжением владельца банковского счета о выполнении некоторой банковской операции. Деньги с его счета могут быть переведены на счет взломщика защиты. Защиту от такого взлома защиты можно осуществить следующим образом. Вместе с функцией f в ПП определена другая функция – Stamp, по которой отправитель сообщения должен вычислить число S= Stamp (x, R) используется секретное слово х и текст передаваемого сообщения. Функция Stamp так же считается хорошо известной всем пользователям ПП и обладает такими свойствами, что по значению S практически невозможно не восстановить х, не подобрать другое сообщение R с соответствующей электронной подписью.

Т.о., передаваемое сообщение будет иметь вид R у S, при чем у позволяет адресату установить истинность клиента, а S как бы скрепляет защищаемое сообщение R с электронной подписью у. В связи с этим число называется электронной печатью.

В таких ПП определена еще одна функция Notary, по которой получатель защищаемого сообщения проверяет истинность передаваемого сообщения Notary (R, Y, S). Это позволяет установить, что сообщение R принадлежит владельцу секретного слова х. Защита от защиты необходима в том случае, когда пользователь забыл свой пароль. Для такого случая должна быть предусмотрена возможность для особого пользователя (администратора ПП), отвечающего за функционирование системы защиты, производить временное снятие защиты от несанкционированного доступа, для хозяина забытого пароля с целью дать ему возможность зафиксировать новый пароль.

Тестирование ПП

Тестирование проходит любой ПП: будь то небольшой учебный пример или целая ИС. Вопрос только в том, сколько нужно тестировать и когда можно считать программу протестированной.

Людям свойственно ошибаться при любом виде деятельности, в т.ч. при создании программ. Конечно, эти ошибки неумышленные и человек их может исправить, но как говорят «программ без ошибок не бывает» и на некотором этапе тестирования возникает вопрос, стоит ли дальше искать ошибки или смириться с их некоторым количеством до поры до времени. Этот вопрос подводит к определенным критериям, по которым можно судить, что программа более или менее работоспособна.

Можно написать программу из одного оператора без единой ошибки. Казалось бы, к одному безошибочному оператору можно добавить еще один, затем еще один. На первый взгляд безошибочный, но т.к. люди могут ошибаться, то результат получается не тот, который ожидается.

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

Сократить количество ошибок можно несколькими путями:

    1. применять спец.методы и средства написания программы (например, case-средства)

    2. применять надежные многократно протестированные компоненты и библиотеки

    3. строго соблюдать и контролировать (!) соответствие создаваемых программ в проектной документации

    4. еще один эффективный, но трудоемкий метод сокращения ошибок – тестирование. Обычно ресурсов для полного тестирования не хватает. Поэтому полное тестирование с проверкой системы во всех режимах и со всеми параметрами труднореализуемо.

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

Важно определить достижения необходимого качества программ.

  1. отсутствие синтаксических ошибок и аварийных остановок в программе, что достигается прогоном программы с различными данными по максимальному числу ветвей. Для определения участков, которые ни разу не были запущены при прогоне программы, существуют спец.средства. Из практики работы можно сделать вывод, что участок программы, который ни разу не был запущен при тестировании, примерно в 80% случаев - неработоспособен.

  2. выполняемые функции программ соответствуют технической документации

  3. расчетные значения, полученные при помощи процедур расчета, соответствуют эталонным.

Часто первые два уровня можно протестировать одновременно, внося соответствующие коррективы в программную документацию. Последний уровень – самый длительный и трудно тестируемый, т.к. сложно подготовить тест на все возможные сочетания данных. Поэтому существует т.н. β-тестирование, т.е. тестирование с самими пользователями.

Первый этап тестирования можно прекращать, когда есть уверенность, что большая часть синтаксических ошибок и аварийных остановов устранена. Остальные ошибки постепенно будут устраняться в процессе др.этапов тестирования.

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

Третий этап тестирования можно прекращать, когда основные расчетные тесты дают правильные результаты.

Тестирование пользователями будет продолжаться на протяжении всего жизненного цикла ПП на более современное. Пользователи будут находить в нем неточности и ошибки, с которыми они вынуждены будут привыкнуть, и начнут воспринимать их как само собой разумеющееся, пока программисты не разработают новую версию, в которой будут исправлены старые ошибки и добавлены новые. И все начнется сначала.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]