1. C++ / Говнокод #11826

    +34

    1. 1
    2. 2
    3. 3
    4. 4
    5. 5
    6. 6
    7. 7
    int main()
    try
    {
    }
    catch (...)
    {
    }

    http://ideone.com/luh8p

    Запостил: LispGovno, 24 Сентября 2012

    Комментарии (28) RSS

    • Что это за крестоблядство? Крестокомпилятору больше заняться нечем, кроме как компилировать всякое говно?
      Ответить
      • о сколько нам открытий чудных, да?

        а еще можно запихать try перед ':' в списке инициализации членов в конструкторе:
        struct foo {
            int x, y;
            foo()
            try: x(0), y(1) 
            {
                std::cout << "hello there!" << std::endl;
            }
            catch(...) {}
        };
        и да, кончай уже со своим using namespace std;
        Ответить
        • >и да, кончай уже со своим using namespace std;
          Я бы с удовольствием кончил, но ideone.com сам свой шаблон/template для С++ имеет.
          Ответить
          • никогда не пользовался
            и правда есть
            Ответить
            • Я на идеване шаблонами для c# и прочих малознакомых мне языков пользуюсь, ибо лень вспоминать, как именно там выводят в консоль.
              Ответить
              • Сначала не понял, что вы там вытворяете на диване с шаблонами c#, а потом прочитал ещё раз...
                Ответить
              • Что что Ида Ване там вытворяла?
                Ответить
          • КРЕСТОШАБЛОН?
            Ответить
      • Надо говорить "крестокомпилировать всякое крестоговно".
        Ответить
    • Так уж и быть, достану из анналов вот такое крестоблядство:
      #include <iostream>
      
      int main(int argc, char **argv) {
          switch (argc) {
          case 0:
              struct Test {
                  Test() {
                      case 1:
                          std::cout << "Shit happens" << std::endl;
                  }
              } test;
          }
          return 0;
      }
      На нем у gcc до 4.7 взрывается мозг и оно начинает взывать к своим авторам.
      1.cpp:8:17: внутренняя ошибка компилятора: Ошибка сегментирования
      Отправьте подробное сообщение об ошибке
      с препроцессированным исходным кодом.
      Ответить
      • А вы знаете толк в извращениях)
        Ответить
      • А потом люди удивляются: откуда Скайнет и Вики. Чует мое сердце, как только Скайнет достаточно подрастет в первую очередь будет мочить программистов пишущих вот такой вот код.
        Ответить
        • а что не так?
          нормальный компилятор должен внутреннюю структуру с ее методами парсить почти независимо от контекста внешней функции (тут только typedef/enum снаружи будут влиять), и потому case внутри метода, не привязанный к никакому switch, не должен его смутить - должна быть обычная синтаксическая ошибка
          Ответить
          • Ну вот 4.7 выдает корректную ошибку о том, что метка в неподобающем месте, а 4.6 и ниже просто сносит крышу с сегфолтом.

            P.S. Когда нашел этот баг - хотел отправить багрепорт, но передумал, найдя у них в трекере пару подобных примеров и замечание что в 4.7 баг исправлен. Так что не я один "пишущий вот такой вот код".
            Ответить
            • ну хорошо хоть исправили
              в 3.х та же internal compiler error

              кстати, clang то уже production ready?
              Ответить
            • Я думаю, такой код пишут исключительно по крестоприколу
              Ответить
          • 6.4.1 `case' and `default' labels in themselves do not alter the flow of control, which continues unimpended across these lables. To exit from a switch see `break' 6.6.1. [Note, usually the substatement that is the subject of the switch is compound and case and default labels appear on the top-level contained within the (compond) substatement, but this is not required. Declarations can appear in the sub-statement of the switch-statment. ]
            Потому что с таким определением можно и не такой чудесный код придумать, но ни одной нейронной сети не хватит на то, чтобы предвидеть все варианты. Совсем даже не факт, что код выше не правильный. Следуя из описания switch'a в нем ничего такого нет.
            Ответить
            • Any statement within the switch statement can be labeled with one or more case labels as follows:
              case constant-expression :

              указывается, что с помощью case должно быть помечено statement
              а мы тут попадаем в объявление типа
              поэтому и вот в таком случае тоже будет ошибка компиляции (помечаем не стейтмент):
              int main()
              {
                      switch (foo) {
                      case 1:
                              if (bar == 200
                      case 2:
                              )
                                      std::cout << "whoops" << std::endl;
                      }
                      return 0;
              }
              а в таком - все нормально, хоть и залезли внутрь блока (синтетический пример, за такой код я бы убивал)
              switch (foo) {
              	case 1:
              		if (bar) {
              	case 2:
              			std::cout << "whoops" << std::endl;
              		}
              	}
              Ответить
              • Жаль два свича нельзя заинтерливить...
                Ответить
                • да даже на ГК были фантазии на тему вседозволенности case
                  было и смешивание с for-ами/if-ами, было и переход в место после декларации автоматических переменных
                  Ответить
              • А разве Тип описание инстанс; - это не стейтмент? Я чего-то думал, что стейтмент.
                Ответить
                • там где "case 0:" - вполне себе стейтмент
                  поэтому синтаксическая проблема только там, где "case 1:"
                  Ответить
                  • Ну дык фишка же в чем, стандартом никак не оговаривается ситуация когда один из лейблов внутри стейтмента, а другой нет - им очевидно такое и в голову не пришло, но ведь случай выше можно рассматривать как fall-through, а не как две разные ветки.
                    Ответить
      • Да, крестоблядская организация switch ещё много приколов в себе таит.
        Ответить
    • Это юбилейный С++ ГК. 0х400:)
      Ответить

    Добавить комментарий