Как создать хорошие проблемы отладки для конкурса? - PullRequest
4 голосов
/ 21 января 2010

Я участвую в конкурсе, и в одном случае у нас есть вопросы по отладке. Я должен спроектировать несколько действительно хороших проблем отладки в C и C ++.

Как я могу создать некоторые хорошие проблемы при отладке? Какие аспекты я должен учитывать при разработке проблемы?

Ответы [ 6 ]

8 голосов
/ 21 января 2010

Мой мозговой штурм:

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

Разовые ошибки для циклов массивов также являются классическими.

Тогда вы можете просто связываться с умами читателей, играя с именами вещей. Создайте переменные с чуть разными именами, переменные с рандомизированными (и слегка различающимися) именами и т. Д., А затем позвольте им попытаться определить место, где вы смешали length и lenght. Не забывайте о различиях в корпусе.

Соглашения о вызовах также могут быть использованы для создания тонких ошибок (например, изменение порядка параметров).

Также давайте не будем забывать о бесконечных часах удовольствия от хитрых определений и шаблонов препроцессора (знаете ли вы, что шаблоны C ++ предположительно завершаются по Тьюрингу?) Ошибки метапрограммирования должны быть интересными.

Следующая идея, которая приходит в голову, - предоставить правильную программу, но с ошибочными входными данными (тонко, конечно). После этого программа потерпит неудачу из-за отсутствия проверки ошибок, но пройдет некоторое время, пока люди не поймут, что ищут проблемы не в том месте.

Условия гонки часто сложно воспроизвести и исправить, попробуйте поиграть с многопоточностью.

При случайном осмотре можно легко пропустить переполнение / переполнение.

И последнее, но не менее важное: если вы программист, попробуйте вспомнить, что было последней большой проблемой, на решение которой вы потратили две недели. Если вы не программист, попробуйте найти и спросить их. Я программист .NET, поэтому, к сожалению, мой опыт мало связан с вашим требованием C / C ++.

5 голосов
/ 21 января 2010

Для некоторых простых упражнений "найдите ошибку в этом исходном коде", посмотрите Ошибка PC-lint в архиве месяца .

3 голосов
/ 21 января 2010

В дополнение к вышесказанному рассмотрим побочные эффекты. Например:

// this function adds two ints and returns the sum

int add_em(int &one, int &two)
{
   two += one;
   return two;
}

Как видите, этот код изменяет переменную two , хотя в комментарии это не упоминается ...

1 голос
/ 21 января 2010

Я добавлю к ответам выше, что другой формой ошибок является неправильное использование некоторой библиотеки или кода API. Внешне все выглядит хорошо, но есть некоторое предостережение (например, предварительное условие или ограничение), о котором никто не знает. Интерактивные отладчики сами по себе не так эффективны в таких ситуациях, потому что они не предоставляют вам эту информацию (она часто скрыта в документации).

Например, в прошлом я изучал этот материал. Я дал людям код, который использовал (API обмена сообщениями в Java), где ошибка заключалась в том, что программа зависала, как только вы пытались получить сообщение. Отладка в интерактивном режиме была почти невозможна. Им пришлось вручную выяснить, что происходит, и понять, что одна из очередей была настроена неправильно.

Подобные ошибки на самом деле довольно распространены.

1 голос
/ 21 января 2010

Отладка - это широкая область, и может быть целесообразно отразить это в ваших вопросах. Не вдаваясь в подробности, вижу следующие категории:

Отладка на уровне источника - без подсказок

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

Отладка на уровне источника - заявленная проблема

Вопросы в этой категории имеют исходный код, а также желаемый результат в сравнении с фактическим выводом / поведением. Например. «Эта программа должна печатать 42, но вместо этого печатает нехватку памяти. Почему?»

Код сбоя

Вопросы в этой категории приходят не только с исходным кодом, но и с аварийным дампом.

0 голосов
/ 21 января 2010

Реальная отладка может включать проблемы с поиском синхронизации и проблемы между управляемой / неуправляемой границей, поэтому рассмотрите вариант c / c ++ / c #.

Или для реального удовольствия рассмотрите возможность использования только c # и обнаружения утечек памяти.

Кроме того, вам необходимо указать, какие инструменты разрешено использовать. В Windows доступны буквально десятки инструментов отладки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...