\
А вчерась мне была выволочка. Хозяин выволок меня за волосья на двор и отчесал шпандырем за то, что я создал несколько
потоков и по нечаянности доступ не синхронизировал. А на неделе хозяйка велела вернуть буфер из служебной функции, а я
объявил локальный массив внутри функции и на него указатель вернул. А она взяла стэк с мусором и начала моей харей по
ему водить...
А. Воробей (LJ USER avva)
Еще раз подчеркиваю, все приведенные фрагменты не я придумал, это студенты такое на полном серьезе писали и, зачастую, искренне недоумевали и возмущались, когда я им говорил, что так нельзя.
На самом деле, много ценных экспонатов по разным причинам были безвозвратно утеряны, так что коллекция пока невелика.
Задача 4 практикума "Многопоточное программирование".
Человек пытался передать параметры так, чтобы они продолжали существовать после завершения нити main. Идея по своему остроумная, но.... Я долго не мог понять, почему это работает, пока не догадался проверить код возврата pthread_attr_setstack.
Задача 5 практикума "Многопоточное программирование". (прикол заметен только при исполнении под солярисом.)
Человек некоторое время пытался объяснить, что такое отрицательный адрес. К сожалению, объяснение нигде не записано.
Задача 16 практикума "Системные вызовы и библиотеки Unix SVR4".
Обратите внимание, как он выключает канонический режим ввода. Справедливости ради, студент быстро понял, что так неправильно - а вот понять, как правильно, смог не сразу. Интересный промежуточный вариант: 16-1.c.
В той же группе у другого студента был (к сожалению, не сохранившийся) гораздо более веселый пример проверки флага путем сравнения cc_lflags с битом на равенство, да еще несколькими разными способами.
Задача 20 практикума "Многопоточное программирование".
Наверное, надо объявлять конкурс гипотез, что и зачем афтар пытался сделать. Нет, что он пытался убить сибя - это сразу понятно. Но вот кто сможет объяснить, зачем это делать таким образом? Я-то знаю... ну, примерно...
Какая задача - это даже, собственно, неважно. Просто некоторым тяжело дается переучивание с паскаля...
Вычисление корней квадратного уравнения
Закомментированный код более-менее разумный. Но когда я попросил студента сделать ввод аргументов из командной строки (т.е. через argv) он написал вот это и в течении получаса пытался запустить. Кончилось тем, что я на него написал докладную на кафедру.
Задача 1 практикума "Системные вызовы и библиотеки Unix SVR4".
Я попросил студента исправить программу так, чтобы она разумно реагировала в ситуации, когда она ожидает в качестве параметра число, а ей передают не число. Он довольно быстро понял, что вызовы atol(3C) необходимо заменить на strtol(3C), но как он потом обращается с выходными параметрами strtol - это нечто.
Написано в рамках дипломной практики
Форматирование оригинала. Честно-честно.
Но один момент хороший, ничего не скажешь. Там кардинал спрашивает у этого мужика: Он один?
Тот ему: Нет, Ваше Преосвещенство.
- Двое?
- Нет, Ваше Преосвещенство.
- Трое?
- Нет, Ваше Преосвещенство.
- Четверо?
- Нет, Ваше Преосвещенство.
- Пятеро?
- Нет, Ваше Преосвещенство.
- Шестеро?
- Нет, Ваше Преосвещенство.
- Сколько-же?
- Семь, Ваше Преосвещенство.
Я могу объяснить, почему Ивану понравился этот диалог: он очень напоминает его авангардные стихотворения.
(c) В. Шинкарев
Задача 2 практикума "многопоточное программирование".
Если честно, мне самому потребовалось секунд 10, чтобы сообразить, почему это вообще компилируется.
Задача 25 практикума "Системные вызовы и библиотеки Unix SVR4".
Самое сложное для меня было - понять, почему студент считал, что оно работает.
Задача 5 практикума "Системные вызовы и библиотеки Unix SVR4".
Самый экспонат находится в строке 75 и окружающей эту строку логике. Студент всего-то навсего пытался обработать ситуацию, когда введенная пользователем строка не является числом...
read(fd[0], msgin, stdin);
Задача 25
практикума "Системные вызовы и
библиотеки Unix SVR4".
К чести пациента надо отметить, что он завис как раз над вопросом, как из строковых argv сделать double. Попутно выяснилось, что он не знает слова stdin.
Картинка
Подробнее о происхождении шедевра
Задача 9 практикума "Системные вызовы и библиотеки Unix SVR4". На ассемблере.
Просьба моя состояла в том, чтобы студент передавал команде cat все аргументы своего процесса. Студент мою просьбу выполнил. Экспонат находится между меткой fork_success и комментарием #execv(file_cat, argv) Все-таки, когда на ассемблере берется писать человек, не имеющий представления, где, что, в каком виде и зачем лежит в памяти, это ужасно.
Задача 25 практикума "Системные вызовы и библиотеки Unix SVR4". Я попросил студента избавиться от чтений по одному символу и сделать поддержку юникода. Желание было выполнено буквально (хотя и не полностью). Кстати, вот так выглядел
первый вариант.
Интересно, много ли народу знает, почему это вообще [иногда] работает?
Update: вот как работоспособность второго варианта объясняет сам автор программы:
В линуксе, физически русские
символы занимают 2 байта, но фактически они помещаются в 1 байт. То есть в первом варианте программы сначала
считывали первый байт символа, не несущий полезной информации, а потом второй байт, в котором, собственно, и
содержался русский символ.
Задача 5
практикума "Системные вызовы и
библиотеки Unix SVR4". write(O_READONLY, ...
Признаться, я так и не постиг ход мысли, который заставил его так написать.
Самое смешное, что оно работает (во всяком случае, в Solaris O_RDONLY==0).