Калайда В.Т., Романенко В.В. Технология разработки программного обеспечения (1015641), страница 17
Текст из файла (страница 17)
Есть ли переменные со сходными именами (например,VOLT и VOLTS)? Наличие сходных имен не обязательно является ошибкой, но служит признаком того, что имена могутбыть перепутаны где-нибудь внутри программы.6.3.3.3 Ошибки вычислений1. Имеются ли вычисления, использующие переменныенедопустимых (например, неарифметических) типов данных?2. Существуют ли вычисления, использующие данныеразного вида? Например, сложение переменной с плавающейточкой и целой переменной. Такие случаи не обязательно являются ошибочными, но они должны быть тщательно проверены для обеспечения гарантии того, что правила преобразования,принятые в языке, понятны. Это особенно важно для языков сосложными правилами преобразования (например, для PL/1, Си).Например, следующий фрагмент программы на PL/1:DECLARE A BIT(1);A=1;определяет значение A равным битовому 0, а не 1. Или в языкеСи попытка присвоить переменной с плавающей точкой значение 1/2 даст значение 0 (т.к.
1 и 2 имеют целый тип).1083. Существуют ли вычисления, использующие переменные, имеющие одинаковый тип данных, но разную длину? Такой вопрос справедлив для PL/1, и возник он из этого языка.Например, в PL/1 результатом вычисления выражения 25 + 1/3будет 5.333..., а не 25.333… Аналогично, в языке Си присутствуют множество данных одного типа, но имеющих разнуюдлину. Например, это целые типы (CHAR, INT, LONG, SHORT,INT64 и т.д.), вещественные типы (FLOAT, DOUBLE, LONGDOUBLE) и т.д.
К тому же, эти типы могут быть как знаковыми(SIGNED), так и беззнаковыми (UNSIGNED).4. Имеет ли результирующая переменная оператора присваивания атрибуты, описывающие ее с меньшей длиной, чем ватрибутах выражения в правой части?5. Возможны ли переполнение или потеря результата вовремя вычисления выражения? Это означает, что конечный результат может казаться правильным, но промежуточный результат может быть слишком большим или слишком малым длямашинного представления данных.6. Возможно ли, чтобы делитель в операторе деления былравен нулю?7.
Если величины представлены в машине в двоичнойформе, получаются ли какие-нибудь результаты неточными?Так, 100,1 редко равно 1.0 в двоичной машине.8. Может ли значение переменной выходить за пределыустановленного для нее диапазона? Например, для операторов,присваивающих значение переменной PROB (имеющей смыслвероятности какого-либо события), может быть произведенапроверка, будет ли полученное значение всегда положительными не превышающим 1,0.9. Верны ли предположения о порядке оценки и следования операторов для выражений, содержащих более чем одиноператор?10. Встречается ли неверное использование целой арифметики, особенно деления? Например, если I — целая величина,то выражение 2*I/2 = I зависит от того, является значение I четным или нечетным, и от того, какое действие — умножение илиделение — выполняется первым.1096.3.3.4 Ошибки при сравнениях1. Сравниваются ли в программе величины, имеющие несовместимые типы данных (например, строка символов с адресом)?2.
Сравниваются ли величины различных типов или величины различной длины? Если да, то проверьте, правильно лиинтерпретируются (поняты) правила преобразования.3. Корректны ли операторы сравнения? Программисты часто путают такие отношения, как наибольший, наименьший,больше чем, не меньше чем, меньше или равно.4. Каждое ли булевское выражение сформулировано так,как это предполагалось? Программисты часто делают ошибкипри написании логических выражений, содержащих операции«И», «ИЛИ», «НЕ».5. Являются ли операнды булевских выражений булевскими? Существуют ли ошибочные объединения сравнений и булевских выражений? Они представляют другой часто встречающийся класс ошибок.
Примеры нескольких типичных ошибокприведены ниже. Если величина L определена как лежащая винтервале между 2 и 10, то выражение 2<L<10 является неверным. Вместо него должно быть написано выражение(2 < L)&(L < 10). Если же величина L определена как большая,чем Х или Y, то выражение L>X|Y является неверным; онодолжно быть записано в виде (L>Х) | (L>Y). При сравнениитрех чисел на равенство выражение IF (A=B=C) означает совсем другое.
Например, в языке Си произойдет присвоениепеременным A и B значения переменной C. А условие будет истинным, если это значение ненулевое. В случае необходимостипроверить математическое отношение X=Y=Z правильным будет выражение (X=Y)&(Y=Z). Также в языке Си следует различать булевские и битовые операторы. Например, если A = 1 иB = 2, то условие IF(A && B) будет истинно, а IF(A & B) —ложно.6. Сравниваются ли в программе мантиссы или числа сплавающей запятой, которые представлены в машине в двоичной форме? Это является иногда источником ошибок из-за усечения младших разрядов. Или из-за неточного равенства чиселв двоичной и десятичной формах представления.1107.
Верны ли предположения о порядке оценки и следовании операторов для выражений, содержащих более одного булевского оператора? Иными словами, если задано выражение(А==2)&(В==2)|(С==3), понятно ли, какая из операций выполняется первой: И или ИЛИ?8. Влияет ли на результат выполнения программы способ,которым конкретный компилятор выполняет булевские выражения? Например, операторIF (ХО)&((Y/X)>Z)является приемлемым для некоторых компиляторов PL/1(т.е. компиляторов, которые заканчивают проверку, как толькоодно из выражений оператора «И» окажется ложным), но приведет к делению на 0 при использовании других компиляторов.6.3.3.5 Ошибки в передачах управления1. Если в программе содержится переключатель (например, вычисляемый оператор GO TO в Фортране или его аналогON… GOTO в Бейсике), то может ли значение индекса когдалибо превысить число возможных переходов? Например, всегдали L будет принимать значение 1, 2 или 3 в операторе ФортранаGO TO (200, 300, 400), L или операторе Бейсика ON L GOTO200, 300, 400?2.
Будет ли каждый цикл, в конце концов, завершен? Придумайте неформальное доказательство или аргументы, подтверждающие их завершение.3. Будут ли программа, модуль или подпрограмма, в конечном счете, завершены?4. Возможно ли, что из-за входных условий цикл никогдане сможет выполняться? Если это так, то является ли этооплошностью? Например, что произойдет для циклов, начинающихся операторами:DO WHILE (NOTFOUND)DO I=X ТО Zесли первоначальное значение NOTFOUND — ложь или если Хбольше Z?1115. Для циклов, управляемых как числом итераций, так ибулевским условием (например, цикл для организации поиска),какова последовательность «погружения в тело цикла»? Например, что произойдет с циклом, имеющим заголовокDO I=1 ТО TABLESIZE WHILE (NOTFOUND)если NOTFOUND никогда не принимает значение «ложь»?6.
Существуют ли какие-нибудь ошибки «отклонения отнормы» (например, слишком большое или слишком малое число итераций)?7. Если язык программирования содержит понятие группы операторов (например, DO-группы в PL/1, ограниченныеоператорами DO-END), то имеется ли явный оператор END длякаждой группы и соответствуют ли операторы END своимгруппам?8. Существуют ли решения, подразумеваемые по умолчанию? Например, пусть ожидается, что входной параметр X принимает значения 1, 2 или 3. Логично ли тогда предположить,что он должен быть равен 3, если он не равен 1 или 2? Например, рассмотрим программу на языке Си:switch(X){case 1: printf(“1!!!”); break;case 2: printf(“2!!!”); break;default: printf(“3!!!”);}Коль скоро это так, то является ли предположение правильным?6.3.3.6 Ошибки интерфейса1.
Равно ли число параметров, получаемых рассматриваемым модулем, числу аргументов, передаваемых каждым из вызывающих модулей? Правилен ли порядок их следования?2. Совпадают ли атрибуты (например, тип и размер) каждого параметра с атрибутами соответствующего ему аргумента?1123. Совпадают ли единицы измерения каждого параметра сединицами измерения соответствующих аргументов? Например,нет ли случаев, когда значение параметров выражено в градусах, а аргумента — в радианах?4.
Равно ли число аргументов, передаваемых из рассматриваемого модуля другому модулю, числу параметров, ожидаемых в вызываемом модуле?5. Соответствуют ли атрибуты каждого аргумента, передаваемого другому модулю, атрибутам соответствующего параметра в рассматриваемом модуле?6. Совпадают ли единицы измерения каждого аргумента,передаваемого другому модулю, с единицами измерения соответствующего параметра в рассматриваемом модуле?7.
Если вызываются встроенные функции, правильно лизаданы число, атрибуты и порядок следования аргументов?8. Если модуль имеет несколько точек входа, передаетсяли параметр всегда вне зависимости от точки входа? Такаяошибка присутствует во втором операторе присваивания следующей программы на PL/1:A: PROCEDURE (W,X);W=X+1;RETURN;В: ENTRY (Y,Z);Y=X+Z;END;9. Не изменяет ли подпрограмма параметр, который должен использоваться только как входная величина?10. Если имеются глобальные переменные (например,переменные в PL/1 с атрибутом EXTERNAL или в Си с атрибутом EXTERN, переменные, указанные в операторах COMMONФортрана), имеют ли они одинаковые определения и атрибутыво всех модулях, которые к ним обращаются?11.
Передаются ли в качестве аргументов константы? Внекоторых реализациях Фортрана такие операторы, какCALL SUBX (J,3)113являются опасными, поскольку, если подпрограмма SUBX присвоит значение второму параметру, значение константы 3 будетизменено.6.3.3.7 Ошибки ввода-вывода1. Являются ли правильными атрибуты файлов, описанных явно?2. Являются ли правильными атрибуты оператора OPEN?3. Согласуется ли спецификация формата с информациейв операторах ввода-вывода? Например, согласуется ли каждыйоператор FORMAT (с точки зрения числа элементарных данныхи их атрибутов) с соответствующими операторами READ иWRITE в программе, написанной на Фортране? То же самоеприменимо к проверке соответствия между списком данных исписком форматов в операторах ввода-вывода PL/1 и Си.114Обращение к данным1.
Используются ли переменные снеустановленными значениями?2. Лежат ли индексы вне заданныхграниц?3. Есть ли нецелые индексы?4. Есть ли «подвешенные» обращения?5. Корректны ли атрибуты при всехпсевдонимах?6. Соответствуют ли атрибуты записи иструктуры?7. Вычислимы ли адреса битовыхполей? Передаются ли битовые поля вкачестве аргументов?8. Корректны ли атрибутыбазированной памяти?9. Соответствуют ли друг другуопределения структуры, данные ей вразличных процедурах?10. Превышены ли границы строки?11.