непечатаемые символы. Какие еще возможности, хорошо совместимые с
назначением этой программы, можно реализовать?
Чужие ошибки
По правде говоря, большинству программистов не достается удовольствие
разработки совершенно новой системы с нуля. Вместо этого большую часть времени
они проводят, используя, поддерживая, изменяя и неизбежно отлаживая код,
написанный другими людьми.
При отладке чужого кода остается в силе все, что мы сказали об отладке своего
собственного кода. Перед тем как начать
, однако, вы сначала должны добиться
определенного понимания организации программы и хода мысли ее создателей.
Термин "открытие", использованный в одном очень большом программном проекте,
является не такой уж плохой метафорой. Задачей является "открыть", что
происходит в коде, который писали не вы.
Здесь очень сильно могут помочь инструментальные средства. Программы
текстового поиска
типа g rep помогут найти все места использования какого-нибудь
имени. Перекрестные ссылки дают определенное представление о структуре
программы. Граф, показывающий взаимные вызовы функций, ценен, если только он
не очень велик. Пошаговый проход по программе с помощью отладчика поможет
увидеть последовательность событий. Из истории ревизий программы можно узнать,
что происходило в ней с
течением времени. Частые изменения являются знаком
того, что код был плохо понят или подвергался частой смене требований и поэтому
потенциально содержит ошибки.
Иногда вам нужно найти ошибку в программе, которой вы не писали и исходного
текста которой вы даже не имеете. В этом случае задачей является обнаружение и
описание ошибки,
причем так, чтобы вы смогли аккуратно сообщить о ней
разработчику и в то же время, возможно, найти ее обходное решение.
Если вам кажется, что вы нашли ошибку в чужой программе, первым шагом следует
убедиться, что это настоящая ошибка, чтобы не терять ни времени автора, ни
собственного авторитета.
Если вы нашли ошибку
в компиляторе, убедитесь, что это действительно ошибка
компилятора, а не ошибка в вашем коде. Например, операция побитового сдвига
вправо заполняет освобождающиеся биты нулем (логический сдвиг) или знаковым
битом (арифметический сдвиг), а чем именно — в языках С и C++ не указано,
поэтому новички иногда считают, что если конструкция типа
? i = -1; printfO
? i » 1);
выдает неожиданный
результат, то ошибка — в компиляторе. На самом деле это —
вопрос переносимости, потому что данный оператор имеет право действовать по-
разному на разных системах. Попробуйте проверить различные системы и
посмотрите, что произойдет; обратитесь к описанию языка, чтобы удостовериться в
правильной интерпретации результатов.
Убедитесь, что ошибка не нова. Используете ли вы последнюю
версию программы.
Есть ли список исправленных в ней ошибок? Большая часть программного