Калайда В.Т., Романенко В.В. Технология разработки программного обеспечения (1015641), страница 16
Текст из файла (страница 16)
Если список включает много ошибок илиесли эти ошибки требуют внесения значительных изменений,председателем может быть принято решение о проведении после корректировки повторной инспекции программы. Списоканализируется, и ошибки распределяются по категориям, чтопозволяет совершенствовать его с целью повышения эффективности будущих инспекций.В большинстве примеров описания процесса инспектирования утверждается, что во время инспекционного заседанияошибки не должны корректироваться.
Однако существует идругая точка зрения: вместо того, чтобы сначала сосредоточиться на основных проблемах проектирования, необходимо решитьвторостепенные вопросы. Два или три человека, включая разработчика программы, должны внести очевидные исправления впроект с тем, чтобы впоследствии решить главные задачи. Однако обсуждение второстепенных вопросов сконцентрируетвнимание группы на частной области проектирования. Во времяобсуждения наилучшего способа внесения изменений в проекткто-либо из членов группы может заметить еще одну проблему.Теперь группе придется рассматривать две проблемы по отношению к одним и тем же аспектам проектирования, объяснениябудут полными и быстрыми.
В течение нескольких минут целаяобласть проекта может быть полностью исследована, и любыепроблемы станут очевидными. Как упоминалось выше, многиеважные проблемы, возникавшие во время обзоров блок-схем,были решены в результате многократных безуспешных попыток решить вопросы, которые на первый взгляд казались «тривиальными».Время и место проведения инспекции должны быть спланированы так, чтобы избежать любых прерываний инспекционного заседания. Его оптимальная продолжительность, по-видимому, лежит в пределах от 90 до 120 мин.
Так как это заседание является экспериментом, требующим умственного напряжения, увеличение его продолжительности ведет к снижению продуктивности. Большинство инспекций происходит при скоро-103сти, равной приблизительно 150 операторам в час. При этомподразумевается, что большие программы должны рассматриваться за несколько инспекций, каждая из которых может бытьсвязана с одним или несколькими модулями или подпрограммами.Для того чтобы инспекция была эффективной, должныбыть установлены соответствующие отношения.
Если программист воспринимает инспекцию как акт, направленный личнопротив него, и, следовательно, занимает оборонительную позицию, процесс инспектирования не будет эффективным. Программист должен подходить к нему с менее эгоистической позиции; он должен рассматривать инспекцию в позитивном иконструктивном свете. Объективно инспекция является процессом нахождения ошибок в программе и, таким образом, улучшает качество его работы. По этой причине, как правило, рекомендуется результаты инспекции считать конфиденциальнымиматериалами, доступными только участникам заседания. Вчастности, использование результатов инспекции руководствомможет нанести ущерб целям этого процесса.Процесс инспектирования, в дополнение к своему основному назначению, заключающемуся в нахождении ошибок, выполняет еще ряд полезных функций. Кроме того, что результаты инспекции позволяют программисту увидеть сделанные имошибки и способствуют его обучению на собственных ошибках, он обычно получает возможность оценить свой стиль программирования и выбор алгоритмов и методов тестирования.Остальные участники также приобретают опыт, рассматриваяошибки и стиль программирования других программистов.Наконец, инспекция является способом раннего выявления наиболее склонных к ошибкам частей программы, позволяющим сконцентрировать внимание на этих частях в процессевыполнения тестирования на ЭВМ (один из принципов тестирования п.
6.2).6.3.3 Список вопросов для выявления ошибок приинспекцииВажной частью процесса инспектирования является проверка программы на наличие общих ошибок с помощью списка104вопросов для выявления ошибок. Концентрация внимания впредлагаемом списке на рассмотрении стиля, а не ошибок (вопросы типа «Являются ли комментарии точными и информативными?» и «Располагаются ли операторы THEN/ELSE иDO/END по одной вертикали друг под другом?») представляется неудачной. Также неудачным представляется и наличиенеопределенности в списке, уменьшающее его полезность (вопросы типа «Соответствует ли текст программы требованиям,выдвигаемым при проектировании?»).
Список, приведенный вданном разделе, был составлен после многолетнего изученияошибок программного обеспечения. В значительной мере он является независимым от языка; это означает, что большинствоошибок встречается в любом языке программирования.6.3.3.1 Ошибки обращения к данным1. Существуют ли обращения к переменным, значения которым не присвоены или не инициализированы? Наличие переменных с не установленными значениями — наиболее частовстречающаяся программная ошибка, она возникает при различных обстоятельствах.
Для каждого обращения к единице данных (например, к переменной, элементу массива, полю в структуре) попытайтесь неформально «доказать», что ей присвоенозначение в проверяемой точке.2. Не выходит ли значение каждого из индексов за границы, определенные для соответствующего измерения при всехобращениях к массиву?3.
Принимает ли каждый индекс целые значения при всехобращениях к массиву? Нецелые индексы не обязательно являются ошибкой для всех языков программирования, но представляют практическую опасность.4. Для всех обращений с помощью указателей или переменных-ссылок память, к которой производится обращение,уже распределена? Наличие переменных-ссылок представляетсобой ошибку типа «подвешенного обращения». Она возникаетв ситуациях, когда время жизни указателя больше, чем времяжизни памяти, к которой производится обращение.
Например, ктакому результату приводит ситуация, когда указатель задаетлокальную переменную в теле процедуры, значение указателя105присваивается выходному параметру или глобальной переменной, процедура завершается (освобождая адресуемую память), апрограмма затем пытается использовать значение указателя.Как и при поиске ошибок первых трех типов, попытайтесь неформально доказать, что для каждого обращения, использующего переменную-указатель, адресуемая память существует.5.
Если одна и та же область памяти имеет несколькопсевдонимов (имен) с различными атрибутами, то имеют лизначения данных в этой области корректные атрибуты при обращении по одному из этих псевдонимов? Ошибки типа некорректных атрибутов у псевдонимов могут возникнуть при использовании атрибута DEFINED или базированной памяти вPL/1, оператора EQUIVALENCE в Фортране, глагола REDEFINES в Коболе, записей с вариантами в Паскале илиобъединений (UNION) в языке Си. В качестве примера можнопривести программу на языке Си, содержащую вещественнуюпеременную A и целую переменную B. Обе величины размещены на одном и том же месте памяти (т.е.
помещены в одно и тоже объединение). Если программа записывает величину A, а обращается к переменной B, то, вероятно, произойдет ошибка, поскольку машина будет использовать битовое представлениечисла с плавающей точкой в данной области памяти как целое.6. Отличаются ли типы или атрибуты переменных величин от тех, которые предполагались компилятором? Это может произойти в том случае, когда программа на PL/1 или Коболе считывает записи из памяти и обращается к ним как кструктурам, но физическое представление записей отлично отописания структуры.
Или программа на языке Си, допускающем произвольные преобразования типов, содержит переменную-указатель на структуру типа T1, инициализированную указателем на структуру типа T2 (не наследуемую от T1).7. Существуют ли явные или неявные проблемы адресации, если в машине будут использованы единицы распределения памяти, меньшие, чем единицы адресации памяти? Например, в PL/1 в системе IBM S/370 битовые строки фиксированной длины не обязательно начинаются с границ байтов, а адресами могут быть только границы байтов. Аналогично, в языкеСи размер отдельных полей в структуре может задаваться в битах. Если программа вычисляет адрес битового поля и впослед-106ствии обращается к нему по этому адресу, то может произойтиошибочное обращение к памяти. Такое же положение можетсложиться при передаче подпрограмме (процедуре) битовогополя в качестве аргумента.8.
Если используются указатели или переменные-ссылки,то имеет ли адресуемая память атрибуты, предполагаемыекомпилятором? Примером несоответствия атрибутов можетслужить случай, когда указатель PL/1, по которому базируетсяструктура данных, имеет в качестве значения адрес другойструктуры.9. Если к структуре данных обращаются из несколькихпроцедур или подпрограмм, то определена ли эта структураодинаково в каждой процедуре?10. Не превышены ли границы строки при индексации вней?11.
Существуют ли какие-нибудь другие ошибки в операциях с индексацией или при обращении к массивам по индексу?6.3.3.2 Ошибки описания данных1. Все ли переменные описаны явно? Отсутствие явногоописания не обязательно является ошибкой, но служит общимисточником беспокойства. Так, если в подпрограмме на Фортране используется элемент массива и отсутствует его описание(например, в операторе DIMENSION), то обращение к массиву(например, Х = А(1)), будет интерпретироваться как вызовфункции.
Последнее приведет к тому, что машина будет пытаться обработать массив как программу. Если отсутствует явное описание переменной во внутренней процедуре или блоке,следует ли понимать это так, что описание данной переменнойсовпадает с описанием во внешнем блоке?2. Если не все атрибуты переменной явно присутствуют вописании, то понятно ли их отсутствие? Например, отсутствиеатрибутов, считающееся общепринятым в PL/1, часто являетсяисточником неожиданных осложнений.3. Если начальные значения присваиваются переменным воператорах описания, то правильно ли инициализируются этизначения? Во многих языках программирования присвоение начальных значений массивам и строкам представляется довольно107сложным и, следовательно, является возможным источникомошибок.4.
Правильно ли для каждой переменной определены длина, тип и класс памяти (например, STATIC, AUTOMATIC,BASED или CONTROLLED в PL/1; AUTO, CONST, VOLATILE, REGISTER, STATIC в Си и т.д.)?5. Согласуется ли инициализация переменной с ее типомпамяти? Например, если в подпрограмме на Фортране необходимо устанавливать начальные значения переменной каждыйраз при вызове подпрограммы, переменная должна быть инициализирована в операторе описания, отличном от оператораDATA. Если в PL/1 описывается инициализация величины и начальное значение необходимо устанавливать каждый раз привызове процедуры, то для этой переменной должен быть определен класс памяти АUTОМАТIС, а не STATIC.6.