Пользователь
30,2
рейтинг
27 января 2014 в 19:19

Разработка → Результаты конкурса на самый глючный код C++

После продолжительного обсуждения объявлены победители конкурса Grand C++ Error Explosion Competition. Награды должны были объявить в двух номинациях. Участники первой соревновались по максимальному количеству ошибок на минимальный объём кода. Вторая номинация — творческая, там важно не количество и размер, а качество и красота глюков.

В итоге, абсолютным победителем назван программист Эд Хэнвей (Ed Hanway), приславший такую программу.

#include ".//.//.//.//jeh.cpp"
#include "jeh.cpp"
`
Программа Хэнвея вызывала в шесть раз больше сообщений об ошибках, чем программа ближайшего конкурента в этой номинации.

Победителем по количеству ошибок в категории Plain стал программист Крис Хопман с двойным include.

#include "set>.cpp"
#include "set>.cpp"

В категории «Чистые руки» было запрещено использование препроцессора и здесь победил Марк Алдораси с такой программой.

template<class T,class...>class
C{C<T*const,T,C>a;C<T,C>b;};C<int>c;

В категории «Лучшая обманка» (Best Cheat) победителем назван уже упоминавшийся Крис Хопман. Жюри особенно отметило «использование Perl, единственного языка, менее понятного, чем шаблоны C++».

/usr/include; perl -e "@c=\"x\"x(2**16); while(1) {print @c}" 1>&2

Номинация «Самый неожиданный код».

template<class T>class L{L<T*>operator->()};L<int>i=i->

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

#include <map>
#include <algorithm>
template<class T,class U>void f(T,U u){std::vector<std::vector<T>>v;auto i=end(v);find(i,i,u);find(i,i,&u);U*p,**q,r(),s(U);find(i,i,&p);find(i,i,&q);find(i,i,r);find(i,i,&r);find(i,i,s);find(i,i,&s);}template<class T>void f(T t){f(t,0);f(t,0l);f(t,0u);f(t,0ul);f(t,0ll);f(t,.0);f(t,.0l);f(t,.0f);f(t,' ');f(t,L' ');f(t,u' ');f(t,U' ');f(t,"");f(t,L"");}int main(){f(0);f(0l);f(0u);f(0ul);f(0ll);f(.0);f(.0l);f(.0f);f(' ');f(L' ');f(u' ');f(U' ');f("");f(L"");f(u"");f(U"");}

Наконец, приз в номинации «Чистейшие руки» присуждён Джону Регеру с отличным использованием рекурсии.

struct x struct z<x(x(x(x(x(x(x(x(x(x(x(x(x(x(x(x(x(y,x(y><y*,x(y*w>v<y*,w,x{}
Анатолий Ализар @alizar
карма
749,5
рейтинг 30,2
Пользователь
Реклама помогает поддерживать и развивать наши сервисы

Подробнее
Реклама

Самое читаемое Разработка

Комментарии (39)

  • +32
    Всем участникам конкурса были предложены престижные рабочие места в ведущих компаниях страны.
    • +14
      На должности «террорист-смертник»?
      • +41
        Нет, на должности ведущий разработчик SDK.
        • +19
          Но… Я же… Пишу лучше…
          image
  • +1
    Чего-то я не понял.

    $ cat 1.cpp
    #include ".//.//.//.//jeh.cpp"
    #include "jeh.cpp"
    
    $ gcc 1.cpp
    1.cpp:1:31: фатальная ошибка: .//.//.//.//jeh.cpp: Нет такого файла или каталога
    компиляция прервана.
    
    $ cat 2.cpp
    #include "set>.cpp"
    #include "set>.cpp"
    
    $ gcc 2.cpp
    2.cpp:1:20: фатальная ошибка: set>.cpp: Нет такого файла или каталога
    компиляция прервана.


    И в чём прикол?
    • +8
      Название компилируемого файла должно совпадать с тем, что include-ится. То есть в обоих случаях файл дважды включает сам себя.
      И еще вы в первом листинге пропустили символ `, я подозреваю, что он имеет большое значение.
      • +1
        На обоих в таком варианте gcc просто циклится :)
        • +15
          ideone.com/HsS8oP

          зы: день публикации этой новости — не лучший день для ideone
  • +9
    Мда… Посмотрел на эту жесть и понял насколько я её нуб в крестах.
  • +6
    Да, помнится, когда только начал изучать cpp, в своем первом hello world случайно перепутал << и >> ( написал cout >> «Hello, world!») и получил 26 ошибок в консоль. Забавно, оказывается есть такой конкурс:)
  • +33
    Пожалуйста, распишите хотя бы в комментариях, как [не]работает каждый из примеров и «в чем прикол?».
    • 0
      При попытке скомпилировать выдают гигабайты ошибок и/или кушают гигабайты памяти.
    • 0
      в чем прикол?

      Отличная демонстрация того, что современные компиляторы(интерпретатор, ЯП — нужное подчеркнуть или вставить что-то другое) настолько сложны, что даже безобидный на первый взгляд код вызывает неимоверное количество ошибок, а то и вовсе вводит в ступор сам компилятор.
    • +25
      Про вот это могу сказать, ничего сложного тут нет:
      /usr/include; perl -e "@c=\"x\"x(2**16); while(1) {print @c}" 1>&2
      

      «/usr/include» — это первая команда, автор пытается запустить стандартный директорий юникс-подобных система, что вызовет нефатальную ошибку, управление перейдёт дальше
      «;» — разделитель двух команд
      «perl -e» — запустить интерпретатором Перла код
      поскольку код у нас в кавычках, внутри кавычки приходится экранировать, отсюда слеши, в самой программе слешей нет:
      @c="x"x(2**16); while(1) {print @c}
      
      совершенно неясно что тут непонятного. @c — переменная-массив (на это указывается «собачка»),
      «''x'' x (2**16)» — это всего лишь «повторить букву „x“ два в степени 16 раз». В итоге, в первом элементе массива лежит длинная строка букв «x».
      «while(1) {print @c}» — бесконечное количество раз выводить массив @c. При выводе массива выводятся подряд все его значения без разделителей. В данном случае будет бесконечно выводить одна и та же строка, состоящая из «x»
      «1>&2» — к программе на Перле не относится, стандартная шелловская конструкция «вывести stdout туда же, куда stderr»

      Всё. Не понимаю что так впечатлило жюри.
      • +9
        Наверное они ждали, что она снесёт им систему с корнем, а оно вон как! Строку выводит.
      • +18
        > /usr/include» — это первая команда, автор пытается запустить стандартный директорий юникс-подобных система, что вызовет нефатальную ошибку, управление перейдёт дальше

        Вы не поняли. Данная строка — это не команда сама по себе. Это то, что подставляется после -I в вызов вида «gcc -I $INCLUDE_PATH». Соответственно, /usr/include — это, собственно, параметр для -I, точка с запятой — завершение вызова gcc, а все остальное — уже как вы написали.
        • +2
          Стало яснее, спасибо!
      • +1
        Perl-программисты делятся на две категории:
        1. Те, кого Perl ещё впечатляет. Обычно это те же, кто на ещё Perl не программировали.
        2. Те, кого Perl уже впечатляет. Обычно это те же, кто уже на Perl не программирует.

        P.S.: если честно, то есть ещё третья категория, в которую входят морские свинки по большей части. К сожалению, они не особо многословны, что бы поделиться своими впечатлениями. Есть мнение, что им просто пофиг.
        • +1
          Я на Перле уже несколько лет не пишу, не впечатляет. Я в какой категории?
          • 0
            Во второй. Я там «не» пропустил случайно.
            • +2
              Без «не» лучше.
  • +2
    Я всё же предпочитаю медитировать по старинке, на ошибки буста и компиляцию libreoffice.
  • +21
    >глючный код C++
    >Grand C++ Error Explosion Competition
    Ализар такой Ализар.
    Поясню: конкурс не на глючный код, а на код, который порождает наибольшое количество ошибок при компиляции.
    • 0
      Вот и я не мог распарсить заголовок. Вроде текст о том же, о чём новость на английском, в заголовке — «глючный».
  • +20
    В музее говнокода видел просто шедевр. Файл начинался так:
    #!/usr/blin/perl
    
  • +2
    Всё же не самый глючный код, а порождающий наибольшее количество ошибок компиляции. Глючный код как правило компилируется :-)
  • +2
    Гы! А для Джавы такое есть?
  • –1
    а так?
    include.h
    #include "include.h"
    

    выдает
    c:\Program Files (x86)\CodeBlocks\MinGW\bin>gcc c:\include.h
    In file included from c:\include.h:1:0,
                     from c:\include.h:1,
                     from c:\include.h:1,
                     from c:\include.h:1,
                     from c:\include.h:1,
                     from c:\include.h:1,
                     from c:\include.h:1,
                     from c:\include.h:1,
                     from c:\include.h:1,
                     from c:\include.h:1,
                     from c:\include.h:1,
                     from c:\include.h:1,
                     from c:\include.h:1,
                     from c:\include.h:1,
                     from c:\include.h:1,
                     from c:\include.h:1,
                     from c:\include.h:1,
                     from c:\include.h:1,
                     from c:\include.h:1,
                     from c:\include.h:1,
                     from c:\include.h:1,
                     from c:\include.h:1,
                     from c:\include.h:1,
                     from c:\include.h:1,
                     from c:\include.h:1,
                     from c:\include.h:1,
                     from c:\include.h:1,
                     from c:\include.h:1,
                     from c:\include.h:1,
                     from c:\include.h:1,
                     from c:\include.h:1,
                     from c:\include.h:1,
                     from c:\include.h:1,
                     from c:\include.h:1,
                     from c:\include.h:1,
                     from c:\include.h:1,
                     from c:\include.h:1,
                     from c:\include.h:1,
                     from c:\include.h:1,
                     from c:\include.h:1,
                     from c:\include.h:1,
                     from c:\include.h:1,
                     from c:\include.h:1,
                     from c:\include.h:1,
                     from c:\include.h:1,
                     from c:\include.h:1,
                     from c:\include.h:1,
                     from c:\include.h:1,
                     from c:\include.h:1,
                     from c:\include.h:1,
                     from c:\include.h:1,
                     from c:\include.h:1,
                     from c:\include.h:1,
                     from c:\include.h:1,
                     from c:\include.h:1,
                     from c:\include.h:1,
                     from c:\include.h:1,
                     from c:\include.h:1,
                     from c:\include.h:1,
                     from c:\include.h:1,
                     from c:\include.h:1,
                     from c:\include.h:1,
                     from c:\include.h:1,
                     from c:\include.h:1,
                     from c:\include.h:1,
                     from c:\include.h:1,
                     from c:\include.h:1,
                     from c:\include.h:1,
                     from c:\include.h:1,
                     from c:\include.h:1,
                     from c:\include.h:1,
                     from c:\include.h:1,
                     from c:\include.h:1,
                     from c:\include.h:1,
                     from c:\include.h:1,
                     from c:\include.h:1,
                     from c:\include.h:1,
                     from c:\include.h:1,
                     from c:\include.h:1,
                     from c:\include.h:1,
                     from c:\include.h:1,
                     from c:\include.h:1,
                     from c:\include.h:1,
                     from c:\include.h:1,
                     from c:\include.h:1,
                     from c:\include.h:1,
                     from c:\include.h:1,
                     from c:\include.h:1,
                     from c:\include.h:1,
                     from c:\include.h:1,
                     from c:\include.h:1,
                     from c:\include.h:1,
                     from c:\include.h:1,
                     from c:\include.h:1,
                     from c:\include.h:1,
                     from c:\include.h:1,
                     from c:\include.h:1,
                     from c:\include.h:1,
                     from c:\include.h:1,
                     from c:\include.h:1,
                     from c:\include.h:1,
                     from c:\include.h:1,
                     from c:\include.h:1,
                     from c:\include.h:1,
                     from c:\include.h:1,
                     from c:\include.h:1,
                     from c:\include.h:1,
                     from c:\include.h:1,
                     from c:\include.h:1,
                     from c:\include.h:1,
                     from c:\include.h:1,
                     from c:\include.h:1,
                     from c:\include.h:1,
                     from c:\include.h:1,
                     from c:\include.h:1,
                     from c:\include.h:1,
                     from c:\include.h:1,
                     from c:\include.h:1,
                     from c:\include.h:1,
                     from c:\include.h:1,
                     from c:\include.h:1,
                     from c:\include.h:1,
                     from c:\include.h:1,
                     from c:\include.h:1,
                     from c:\include.h:1,
                     from c:\include.h:1,
                     from c:\include.h:1,
                     from c:\include.h:1,
                     from c:\include.h:1,
                     from c:\include.h:1,
                     from c:\include.h:1,
                     from c:\include.h:1,
                     from c:\include.h:1,
                     from c:\include.h:1,
                     from c:\include.h:1,
                     from c:\include.h:1,
                     from c:\include.h:1,
                     from c:\include.h:1,
                     from c:\include.h:1,
                     from c:\include.h:1,
                     from c:\include.h:1,
                     from c:\include.h:1,
                     from c:\include.h:1,
                     from c:\include.h:1,
                     from c:\include.h:1,
                     from c:\include.h:1,
                     from c:\include.h:1,
                     from c:\include.h:1,
                     from c:\include.h:1,
                     from c:\include.h:1,
                     from c:\include.h:1,
                     from c:\include.h:1,
                     from c:\include.h:1,
                     from c:\include.h:1,
                     from c:\include.h:1,
                     from c:\include.h:1,
                     from c:\include.h:1,
                     from c:\include.h:1,
                     from c:\include.h:1,
                     from c:\include.h:1,
                     from c:\include.h:1,
                     from c:\include.h:1,
                     from c:\include.h:1,
                     from c:\include.h:1,
                     from c:\include.h:1,
                     from c:\include.h:1,
                     from c:\include.h:1,
                     from c:\include.h:1,
                     from c:\include.h:1,
                     from c:\include.h:1,
                     from c:\include.h:1,
                     from c:\include.h:1,
                     from c:\include.h:1,
                     from c:\include.h:1,
                     from c:\include.h:1,
                     from c:\include.h:1,
                     from c:\include.h:1,
                     from c:\include.h:1,
                     from c:\include.h:1,
                     from c:\include.h:1,
                     from c:\include.h:1,
                     from c:\include.h:1,
                     from c:\include.h:1,
                     from c:\include.h:1,
                     from c:\include.h:1,
                     from c:\include.h:1,
                     from c:\include.h:1,
                     from c:\include.h:1,
                     from c:\include.h:1,
                     from c:\include.h:1,
                     from c:\include.h:1,
                     from c:\include.h:1,
                     from c:\include.h:1,
                     from c:\include.h:1,
                     from c:\include.h:1,
                     from c:\include.h:1,
                     from c:\include.h:1,
                     from c:\include.h:1,
                     from c:\include.h:1:
    c:\include.h:1:21: error: #include nested too deeply
    

    • –1
      #include __FILE__
      

      Но на таком, в отличие от кода из поста, gcc быстро поймёт, что над ним издеваются, и выключится.
  • –7
    помогите, пожалуйста исправить такую программу:

    sudo cat «test… test… test...» | perl -e '$??s:;s:s;;$?::s;;=]=>%-{
    • НЛО прилетело и опубликовало эту надпись здесь
      • НЛО прилетело и опубликовало эту надпись здесь
        • +1
          кстати
          cat: test... test.. test...: No such file or directory
          (echo должно быть) Автор поста, видимо, хотел допустить максимальное количество ошибок в этом баяне :-)
          • +1
            • 0
              Емаё :-) я всегда думал, что в этой штуке инпут важен, а она работает и без всяких пайов, cat, echo… Можно просто запускать perl -e ... (то есть, конечно, запускать нельзя :-))

              А насчёт оригинала — сильно сомневаюсь. Мне кажется, эта штука гораздо старше. Лет на 10 как минимум.
              • +1
                Оригинал — это патч Бармина, 1996. «Зашифрован», ЕМНИП, он был как раз на ЛОР гораздо позже.
              • 0
                Ну если верить летописям, оригинал (ну в смысле именно однострочник на perl, не патч Бармина) именно по моей ссылке.

                Я в Perl не разбираюсь, но по ссылке есть анализ, откуда следует что инпут не важен. Более того, предположу что «cat test… test… test...» было добавлено специально. Потому что с ним даже не знающий perl человек будет считать что видит где именно ошибка, и попытается исправить на echo и запустить.
                • 0
                  Здесь нужно понимать исторический контекст, и как оно потом развивалось, и зачем вообще :)

                  Но в любом случае главное не в перловой части.

                  Это просто отсев на невменяемых. В частном случае — работающих под рутом. Актуально до сих пор.

                  :-)
                  • 0
                    Ну тут даже не в руте дело ведь. Если бы команда очищала домашнюю директорию — результат был бы ничем не лучше. Невменяемость скорее заключается в запуске чего попало.

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