Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
kernigan_paik.doc
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
2.91 Mб
Скачать

5.7. Чужие ошибки

По правде говоря, большинству программистов не достается удовольствие разработки совершенно новой системы с нуля. Вместо этого больную часть времени они проводят, используя, поддерживая, изменяя и неизбежно отлаживал код, написанный другими людьми.

При отладке чухого кода остается в силе все, что мы сказали об отладке своего собственного кода. Перед тем как начать, однако, вы сначала должны добиться определенного понимания организации программы и хода мысли ее создателей. Термин "открытие", использованный в одном очень большой .программном проекте, является не такой уж плохой метафорой. Задачей является "открыть", что происходит в коде, который писали не вы.

Здесь очень сильно могут помочь инструментальные средства. Про­граммы текстового поиска типа g rep помогут найти все места использо­вания какого-нибудь имени. Перекрестные ссылки дают определенное представление о структуре программы. Граф, показывающий взаимные вызовы функций, ценен, если только он не очень велик. Пошаговый про­ход по программе с помощью отладчика поможет увидеть последова­тельность событий. Из истории ревизий программы можно узнать, что происходило в ней с течением времени. Частые изменения являются знаком того, что код был плохо понят или подвергался частой смене тре­бований и поэтому потенциально содержит ошибки.

Иногда вам нужно найти ошибку в программе, которой вы не писали и исходного текста которой вы даже не имеете. В этом случае задачей является обнаружение и описание ошибки, причем так, чтобы вы смогли аккуратно сообщить о ней разработчику и в то же время, возможно, най­ти ее обходное решение.

Если вам кажется, что вы нашли ошибку в чужой программе, первым шагом следует убедиться, что это настоящая ошибка, чтобы не терять ни времени автора, ни собственного авторитета.

Если вы нашли ошибку в компиляторе, убедитесь, что это действи­тельно ошибка компилятора, а не ошибка в вашем коде. Например, опе­рация побитового сдвига вправо заполняет освобождающиеся биты ну­лем (логический сдвиг) или знаковым битом (арифметический сдвиг), а чем именно — в языках С и C++ не указано, поэтому новички иногда считают, что если конструкция типа

? i = -1;

? printf("%d\n", i > 1);

выдает неожиданный результат, то ошибка — в компиляторе. На самом деле это — вопрос переносимости, потому что данный оператор имеет право действовать по-разному на разных системах. Попробуйте про­верить различные системы и посмотрите, что произойдет; обратитесь к описанию языка, чтобы удостовериться в правильной интерпретации результатов.

Убедитесь, что ошибка не нова. Используете ли вы последнюю вер­сию программы. Есть ли список исправленных в ней ошибок? Большая часть программного обеспечения проходит серию выпусков; если вы на­шли ошибку в версии 4.0b1, она может быть уже исправлена или замене­на новой в версии 4.0b2. В любом случае немногие программисты испы­тывают достаточно энтузиазма, чтобы исправлять ошибки где-либо, кроме текущей версии программы.

Наконец, представьте самого себя в роли получателя вашего сообщения об ошибке. Вам следует предоставить автору максимально удобный тестовый пример, какой только сможете сделать. Будет не слишком хо­рошо, если ошибку можно показать только при больших объемах входных данных, или в очень сложных условиях, или при наличии множества дополнительных файлов. Сократите тест до минимального самодостаточного случая. Сообщите также дополнительную информа­цию, которая, возможно, связана с ошибкой, например версию самой программы, версию компилятора, операционной системы, состав обору­дования на машине. Для ошибочной версии isprint, упомянутой в параграфе 5.4, мы предоставили такой тестовый случай:

/* тестовая программа для ошибки в isprint */

int main(void)

{

int с;

while (isprint(e = getctiar()) | | с != EOF)

printf("%c", c);

return 0;

}

Входными данными служила любая строка печатного текста, потому что на выходе появлялась только половина входа:

% echo 1234567890 | isprint_test

24680

%

Лучшие сообщения об ошибке — те, что требуют для демонстрации , ошибки только пары строк входных данных на стандартной конфигу­рации, а также те, что содержат и исправление соответствующей ошиб­ки. Шлите такие сообщения об ошибке, какие вам хотелось бы полу­чать самим.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]