1. Существуют ли обращения к переменным, значения которым не присвоены или не инициализированы? Наличие переменных с не установленными значениями — наиболее часто встречающаяся программная ошибка, она возникает при различных обстоятельствах. Для каждого обращения к единице данных (например, к переменной, элементу массива, полю в структуре) попытайтесь неформально «доказать», что ей присвоено значение в проверяемой точке.
2. Не выходит ли значение каждого из индексов за границы, определенные для соответствующего измерения при всех обращениях к массиву?
3. Принимает ли каждый индекс целые значения при всех обращениях к массиву? Нецелые индексы не обязательно являются ошибкой для всех языков программирования, но представляют практическую опасность.
4. Для всех обращений с помощью указателей или переменных-ссылок память, к которой производится обращение, уже распределена? Наличие переменных-ссылок представляет собой ошибку типа «подвешенного обращения». Она возникает в ситуациях, когда время жизни указателя больше, чем время жизни памяти, к которой производится обращение. Например, к такому результату приводит ситуация, когда указатель задает локальную переменную в теле процедуры, значение указателя присваивается выходному параметру или глобальной переменной, процедура завершается (освобождая адресуемую память), а программа затем пытается использовать значение указателя. Как и при поиске ошибок первых трех типов, попытайтесь неформально доказать, что для каждого обращения, использующего переменную-указатель, адресуемая память существует.
5. Если одна и та же область памяти имеет несколько псевдонимов (имен) с различными атрибутами, то имеют ли значения данных в этой области корректные атрибуты при обращении по одному из этих псевдонимов? Ошибки типа некорректных атрибутов у псевдонимов могут возникнуть при использовании атрибута DEFINED или базированной памяти в PL/1, оператора EQUIVALENCE в Фортране, глагола REDEFINES в Коболе, записей с вариантами в Паскале или объединений (UNION) в языке Си. В качестве примера можно привести программу на языке Си, содержащую вещественную переменную A и целую переменную B. Обе величины размещены на одном и том же месте памяти (т.е. помещены в одно и то же объединение). Если программа записывает величину A, а обращается к переменной B, то, вероятно, произойдет ошибка, поскольку машина будет использовать битовое представление числа с плавающей точкой в данной области памяти как целое.
6. Отличаются ли типы или атрибуты переменных величин от тех, которые предполагались компилятором? Это может произойти в том случае, когда программа на PL/1 или Коболе считывает записи из памяти и обращается к ним как к структурам, но физическое представление записей отлично от описания структуры. Или программа на языке Си, допускающем произвольные преобразования типов, содержит переменную-указатель на структуру типа T1, инициализированную указателем на структуру типа T2 (не наследуемую от T1).
7. Существуют ли явные или неявные проблемы адресации, если в машине будут использованы единицы распределения памяти, меньшие, чем единицы адресации памяти? Например, в PL/1 в системе IBM S/370 битовые строки фиксированной длины не обязательно начинаются с границ байтов, а адресами могут быть только границы байтов. Аналогично, в языке Си размер отдельных полей в структуре может задаваться в битах. Если программа вычисляет адрес битового поля и впоследствии обращается к нему по этому адресу, то может произойти ошибочное обращение к памяти. Такое же положение может сложиться при передаче подпрограмме (процедуре) битового поля в качестве аргумента.
8. Если используются указатели или переменные-ссылки, то имеет ли адресуемая память атрибуты, предполагаемые компилятором? Примером несоответствия атрибутов может служить случай, когда указатель PL/1, по которому базируется структура данных, имеет в качестве значения адрес другой структуры.
9. Если к структуре данных обращаются из нескольких процедур или подпрограмм, то определена ли эта структура одинаково в каждой процедуре?
10. Не превышены ли границы строки при индексации в ней?
11. Существуют ли какие-нибудь другие ошибки в операциях с индексацией или при обращении к массивам по индексу?