\ Экспонаты

Программы и фрагменты программ, которые мне пытались сдать на практикумах "Unix" и "Многопоточное программирование"

А вчерась мне была выволочка. Хозяин выволок меня за волосья на двор и отчесал шпандырем за то, что я создал несколько потоков и по нечаянности доступ не синхронизировал. А на неделе хозяйка велела вернуть буфер из служебной функции, а я объявил локальный массив внутри функции и на него указатель вернул. А она взяла стэк с мусором и начала моей харей по ему водить...
А. Воробей (LJ USER avva)

Еще раз подчеркиваю, все приведенные фрагменты не я придумал, это студенты такое на полном серьезе писали и, зачастую, искренне недоумевали и возмущались, когда я им говорил, что так нельзя.

На самом деле, много ценных экспонатов по разным причинам были безвозвратно утеряны, так что коллекция пока невелика.

Экспонат 1 - разделяемый стек

Задача 4 практикума "Многопоточное программирование".

Человек пытался передать параметры так, чтобы они продолжали существовать после завершения нити main. Идея по своему остроумная, но.... Я долго не мог понять, почему это работает, пока не догадался проверить код возврата pthread_attr_setstack.

Экспонат 2 - адрес со знаком

Задача 5 практикума "Многопоточное программирование". (прикол заметен только при исполнении под солярисом.)

Человек некоторое время пытался объяснить, что такое отрицательный адрес. К сожалению, объяснение нигде не записано.

Экспонат 3 - радикальный подход к очистке флага

Задача 16 практикума "Системные вызовы и библиотеки Unix SVR4".

Обратите внимание, как он выключает канонический режим ввода. Справедливости ради, студент быстро понял, что так неправильно - а вот понять, как правильно, смог не сразу. Интересный промежуточный вариант: 16-1.c.

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

Экспонат 4 - Афтар, убей сибя ап стену

Задача 20 практикума "Многопоточное программирование".

Наверное, надо объявлять конкурс гипотез, что и зачем афтар пытался сделать. Нет, что он пытался убить сибя - это сразу понятно. Но вот кто сможет объяснить, зачем это делать таким образом? Я-то знаю... ну, примерно...

Экспонат 5 - Раздельная компиляция

Один файл Второй файл

Какая задача - это даже, собственно, неважно. Просто некоторым тяжело дается переучивание с паскаля...

Экспонат 6 - Полиморфизм gone bad

Вычисление корней квадратного уравнения

Закомментированный код более-менее разумный. Но когда я попросил студента сделать ввод аргументов из командной строки (т.е. через argv) он написал вот это и в течении получаса пытался запустить. Кончилось тем, что я на него написал докладную на кафедру.

Экспонат 7 - Злоупотребление Java до добра не доводит

Задача 1 практикума "Системные вызовы и библиотеки Unix SVR4".

Я попросил студента исправить программу так, чтобы она разумно реагировала в ситуации, когда она ожидает в качестве параметра число, а ей передают не число. Он довольно быстро понял, что вызовы atol(3C) необходимо заменить на strtol(3C), но как он потом обращается с выходными параметрами strtol - это нечто.

Экспонат 8 - Разбор IP адреса

Написано в рамках дипломной практики

Форматирование оригинала. Честно-честно.

Но один момент хороший, ничего не скажешь. Там кардинал спрашивает у этого мужика: Он один?

Тот ему: Нет, Ваше Преосвещенство.

 - Двое?

 - Нет, Ваше Преосвещенство.

 - Трое?

 - Нет, Ваше Преосвещенство.

 - Четверо?

 - Нет, Ваше Преосвещенство.

 - Пятеро?

 - Нет, Ваше Преосвещенство.

 - Шестеро?

 - Нет, Ваше Преосвещенство.

 - Сколько-же?

 - Семь, Ваше Преосвещенство.

Я могу объяснить, почему Ивану понравился этот диалог: он очень напоминает его авангардные стихотворения.
(c) В. Шинкарев

Экспонат 9 - sizeof(stdin)

[Утерян по моей ошибке]

Экспонат 10 - exit;

Задача 2 практикума "многопоточное программирование".

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

Экспонат 11 - переназначение ввода вывода

Задача 25 практикума "Системные вызовы и библиотеки Unix SVR4".

Самое сложное для меня было - понять, почему студент считал, что оно работает.

Экспонат 12 - преобразование строки в число

Задача 5 практикума "Системные вызовы и библиотеки Unix SVR4".

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

Экспонат 13 - ещё одна работа с указателями

Задача 2

Экспонат 14 - и еще одна работа с указателями

read(fd[0], msgin, stdin);
Задача 25 практикума "Системные вызовы и библиотеки Unix SVR4".

Экспонат 14 - еще один квадратный корень

К чести пациента надо отметить, что он завис как раз над вопросом, как из строковых argv сделать double. Попутно выяснилось, что он не знает слова stdin.
Картинка
Подробнее о происхождении шедевра

Экспонат 15 - мы научили мир копировать. херакс, херакс, херакс

Задача 9 практикума "Системные вызовы и библиотеки Unix SVR4". На ассемблере.

Просьба моя состояла в том, чтобы студент передавал команде cat все аргументы своего процесса. Студент мою просьбу выполнил. Экспонат находится между меткой fork_success и комментарием #execv(file_cat, argv) Все-таки, когда на ассемблере берется писать человек, не имеющий представления, где, что, в каком виде и зачем лежит в памяти, это ужасно.

Экспонат 15 - разбор UTF8

Задача 25 практикума "Системные вызовы и библиотеки Unix SVR4". Я попросил студента избавиться от чтений по одному символу и сделать поддержку юникода. Желание было выполнено буквально (хотя и не полностью). Кстати, вот так выглядел

первый вариант. Интересно, много ли народу знает, почему это вообще [иногда] работает? Update: вот как работоспособность второго варианта объясняет сам автор программы:
В линуксе, физически русские символы занимают 2 байта, но фактически они помещаются в 1 байт. То есть в первом варианте программы сначала считывали первый байт символа, не несущий полезной информации, а потом второй байт, в котором, собственно, и содержался русский символ.

Экспонат 16 - запись в O_READONLY

Задача 5 практикума "Системные вызовы и библиотеки Unix SVR4". write(O_READONLY, ...
Признаться, я так и не постиг ход мысли, который заставил его так написать. Самое смешное, что оно работает (во всяком случае, в Solaris O_RDONLY==0).