Файл: Технология раработки програмного обеспечения УП.pdf

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.
background image

 

 

 
 

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.

 

Каждое

 

ли

 

булевское

 

выражение

 

сформулировано

 

так,

 

как

 

это

 

предполагалось?

 

Программисты

 

часто

 

делают

 

ошибки

 

при

 

написании

 

логических

 

выражений,

 

содержащих

 

операции

 

«И»,

 

«ИЛИ»,

 

«НЕ».

 


background image

 

 

 
 

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

 

при

 

использовании

 

других

 

компиляторов.

 


background image

 

 

 
 

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

 

своим

 

группам?

 


background image

 

 

 
 

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.

 

Если

 

вызываются

 

встроенные

 

функции,

 

правильно

 

ли

 

заданы

 

число,

 

атрибуты

 

и

 

порядок

 

следования

 

аргументов?

 


background image

 

 

 
 

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

 

и

 

Си.