ВУЗ: Томский государственный университет систем управления и радиоэлектроники
Категория: Учебное пособие
Дисциплина: Проектирование информационных систем
Добавлен: 21.10.2018
Просмотров: 10790
Скачиваний: 8
111
зультат
может
быть
слишком
большим
или
слишком
малым
для
машинного
представления
данных.
6.
Возможно
ли,
чтобы
делитель
в
операторе
деления
был
равен
нулю?
7.
Если
величины
представлены
в
машине
в
двоичной
форме,
получаются
ли
какие-нибудь
результаты
неточными?
Так,
10
×0,1
редко
равно
1.0
в
двоичной
машине.
8.
Может
ли
значение
переменной
выходить
за
пределы
установленного
для
нее
диапазона?
Например,
для
операторов,
присваивающих
значение
переменной
PROB
(имеющей
смысл
вероятности
какого-либо
события),
может
быть
произведена
проверка,
будет
ли
полученное
значение
всегда
положительным
и
не
превышающим
1,0.
9.
Верны
ли
предположения
о
порядке
оценки
и
следова-
ния
операторов
для
выражений,
содержащих
более
чем
один
оператор?
10.
Встречается
ли
неверное
использование
целой
ариф-
метики,
особенно
деления?
Например,
если
I
—
целая
величина,
то
выражение
2
*
I/2
=
I
зависит
от
того,
является
значение
I
чет-
ным
или
нечетным,
и
от
того,
какое
действие
—
умножение
или
деление
—
выполняется
первым.
6.3.3.4 Ошибки при сравнениях
1.
Сравниваются
ли
в
программе
величины,
имеющие
не-
совместимые
типы
данных
(например,
строка
символов
с
адре-
сом)?
2.
Сравниваются
ли
величины
различных
типов
или
вели-
чины
различной
длины?
Если
да,
то
проверьте,
правильно
ли
интерпретируются
(поняты)
правила
преобразования.
3.
Корректны
ли
операторы
сравнения?
Программисты
часто
путают
такие
отношения,
как
наибольший,
наименьший,
больше
чем,
не
меньше
чем,
меньше
или
равно.
4.
Каждое
ли
булевское
выражение
сформулировано
так,
как
это
предполагалось?
Программисты
часто
делают
ошибки
при
написании
логических
выражений,
содержащих
операции
«И»,
«ИЛИ»,
«НЕ».
112
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.
Сравниваются
ли
в
программе
мантиссы
или
числа
с
плавающей
запятой,
которые
представлены
в
машине
в
двоич-
ной
форме?
Это
является
иногда
источником
ошибок
из-за
усе-
чения
младших
разрядов.
Или
из-за
неточного
равенства
чисел
в
двоичной
и
десятичной
формах
представления.
7.
Верны
ли
предположения
о
порядке
оценки
и
следова-
нии
операторов
для
выражений,
содержащих
более
одного
бу-
левского
оператора?
Иными
словами,
если
задано
выражение
(А==2)&(В==2)|(С==3),
понятно
ли,
какая
из
операций
выпол-
няется
первой:
И
или
ИЛИ?
8.
Влияет
ли
на
результат
выполнения
программы
способ,
которым
конкретный
компилятор
выполняет
булевские
выра-
жения?
Например,
оператор
IF (
Х
≠О)&((Y/X)>Z)
является
приемлемым
для
некоторых
компиляторов
PL/1
(т.е.
компиляторов,
которые
заканчивают
проверку,
как
только
одно
из
выражений
оператора
«И»
окажется
ложным),
но
при-
ведет
к
делению
на
0
при
использовании
других
компиляторов.
113
6.3.3.5 Ошибки в передачах управления
1.
Если
в
программе
содержится
переключатель
(напри-
мер,
вычисляемый
оператор
GO
TO
в
Фортране
или
его
аналог
ON
…
GOTO
в
Бейсике),
то
может
ли
значение
индекса
когда-
либо
превысить
число
возможных
переходов?
Например,
всегда
ли
L
будет
принимать
значение
1,
2
или
3
в
операторе
Фортрана
GO
TO
(200,
300,
400),
L
или
операторе
Бейсика
ON
L
GOTO
200,
300,
400?
2.
Будет
ли
каждый
цикл,
в
конце
концов,
завершен?
Придумайте
неформальное
доказательство
или
аргументы,
под-
тверждающие
их
завершение.
3.
Будут
ли
программа,
модуль
или
подпрограмма,
в
ко-
нечном
счете,
завершены?
4.
Возможно
ли,
что
из-за
входных
условий
цикл
никогда
не
сможет
выполняться?
Если
это
так,
то
является
ли
это
оп-
лошностью?
Например,
что
произойдет
для
циклов,
начинаю-
щихся
операторами:
DO WHILE (NOTFOUND)
DO I=X
ТО Z
если
первоначальное
значение
NOTFOUND
—
ложь
или
если
Х
больше
Z?
5.
Для
циклов,
управляемых
как
числом
итераций,
так
и
булевским
условием
(например,
цикл
для
организации
поиска),
какова
последовательность
«погружения
в
тело
цикла»?
Напри-
мер,
что
произойдет
с
циклом,
имеющим
заголовок
DO I=1
ТО TABLESIZE WHILE (NOTFOUND)
если
NOTFOUND
никогда
не
принимает
значение
«ложь»?
6.
Существуют
ли
какие-нибудь
ошибки
«отклонения
от
нормы»
(например,
слишком
большое
или
слишком
малое
чис-
ло
итераций)?
7.
Если
язык
программирования
содержит
понятие
груп-
пы
операторов
(например,
DO-группы
в
PL/1,
ограниченные
операторами
DO-END),
то
имеется
ли
явный
оператор
END
для
каждой
группы
и
соответствуют
ли
операторы
END
своим
группам?
114
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.
Совпадают
ли
атрибуты
(например,
тип
и
размер)
каж-
дого
параметра
с
атрибутами
соответствующего
ему
аргумента?
3.
Совпадают
ли
единицы
измерения
каждого
параметра
с
единицами
измерения
соответствующих
аргументов?
Например,
нет
ли
случаев,
когда
значение
параметров
выражено
в
граду-
сах,
а
аргумента
—
в
радианах?
4.
Равно
ли
число
аргументов,
передаваемых
из
рассмат-
риваемого
модуля
другому
модулю,
числу
параметров,
ожидае-
мых
в
вызываемом
модуле?
5.
Соответствуют
ли
атрибуты
каждого
аргумента,
пере-
даваемого
другому
модулю,
атрибутам
соответствующего
па-
раметра
в
рассматриваемом
модуле?
6.
Совпадают
ли
единицы
измерения
каждого
аргумента,
передаваемого
другому
модулю,
с
единицами
измерения
соот-
ветствующего
параметра
в
рассматриваемом
модуле?
7.
Если
вызываются
встроенные
функции,
правильно
ли
заданы
число,
атрибуты
и
порядок
следования
аргументов?
115
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)
являются
опасными,
поскольку,
если
подпрограмма
SUBX
при-
своит
значение
второму
параметру,
значение
константы
3
будет
изменено.
6.3.3.7 Ошибки ввода-вывода
1.
Являются
ли
правильными
атрибуты
файлов,
описан-
ных
явно?
2.
Являются
ли
правильными
атрибуты
оператора
OPEN?
3.
Согласуется
ли
спецификация
формата
с
информацией
в
операторах
ввода-вывода?
Например,
согласуется
ли
каждый
оператор
FORMAT
(с
точки
зрения
числа
элементарных
данных
и
их
атрибутов)
с
соответствующими
операторами
READ
и
WRITE
в
программе,
написанной
на
Фортране?
То
же
самое
применимо
к
проверке
соответствия
между
списком
данных
и
списком
форматов
в
операторах
ввода-вывода
PL/1
и
Си.