1. Си / Говнокод #11988

    +138

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    22. 22
    23. 23
    24. 24
    25. 25
    ;;
    ;
    ;
    ;;;
    void fuck()
    {
    	puts("Fuck!");
    	getch();
    }
    void main (int argc, char ** argv) {
    	
    	char ipstr[] = "192.168.1.140";
    
    	int ipint = IPStrToInt(ipstr);
    	atexit(fuck);
    	printf("%s == %ld\n",ipstr,ipint);
    	Init(1,main);
    }
    
    void Init(int govno) {
    	int * p = &govno;
    	void (*x) ()=(void *) *(p+1);
    	printf("%x", *p);
    	x((void *)0);
    }

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

    Запостил: silenter, 24 Октября 2012

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

    • Это такой способ добиться хвостовой рекурсии? Вроде ж проще можно.
      Ответить
      • если обфускацию убрать, то самый раз) если учесть, что это изначально писалось, как говнокод
        Ответить
    • мыши кололись и плакали
      Ответить
    • Суть:
      ;;
      ;
      ;
      ;;;
      
      int * p = &govno;
      Ответить
    • Ворнинги не читаем? Или ваш говнокомпилятор не умеет их показывать?
      1.c:20:6: warning: conflicting types for ‘Init’ [enabled by default]
      1.c:17:5: note: previous implicit declaration of ‘Init’ was here
      Ответить
      • >>Или ваш говнокомпилятор не умеет их показывать?
        >silencer
        Ответить
        • Программист: gcc 1.cpp
          Компилятор: Простите пожалуйста, но вы забыли написать прототип...
          Программист: gcc -w 1.cpp #Заткнись сука и компиль мой код!!! Мне некогда читать твои мляцкие предупреждения!!!
          Компилятор: Okay... как скажете...
          Программа: segmentation fault *trollface.png*
          Программист: (компилятору) Да ты сука упоротая, что ты мне тут насобирал!!!
          Ответить
          • Программист: gcc -Wextra -Werror hello.c
            Компилятор: А НУ СУКА ФОРМАТИРОВАНИЕ ПОПРАВИЛ ИЛИ НАХУЙ ТВОЮ ПОРНУХУ СОТРУ.
            Ответить
            • именно поэтому надо держать порно на readonly партишнах
              Ответить
          • А gcc согласится cpp собирать? Думаю, не очень...
            Ответить
            • Согласится кстати, все соберет. И даже слинкует, если хорошо его попросить (опцией -lstdc++).

              ЕМНИП g++ этот тот же gcc просто дефолтовые опции другие.

              P.S. Один хрен gcc, если я не гоню, это не компилятор C, это сборочный фронтенд, а настоящие компиляторы спрятаны.

              Вроде как настоящие тут:
              /usr/lib/gcc/i686-linux-gnu/4.6/cc1
              /usr/lib/gcc/i686-linux-gnu/4.6/cc1plus
              Ответить
            • >> А gcc согласится cpp собирать? Думаю, не очень...

              Соберёт и не пожалуется. Если там будет Си-код.
              Ответить
              • > Соберёт и не пожалуется. Если там будет Си-код.
                Ну вот только не надо тут мифы создавать. Еще как соберет. Он по расширениям определяет какой бекэнд вызывать. Пруф:
                man gcc
                For any given input file, the file name suffix determines what kind of compilation is done

                man g++
                However, the use of gcc does not add the C++ library. g++ is a program that calls GCC and treats .c, .h and .i files as C++ source files instead of C source files unless -x is used, and automatically specifies linking against the C++ library.
                Вот и все отличия
                Ответить
                • Нашёл забавную вещь на просторах интернетов
                  /* https://github.com/jdarcy/CassFS/blob/master/cli.cpp */
                  
                  // Anonymous types are valid, dammit.
                  struct _gcc_sucks {
                  	const char *	cmd_name;
                  	int	(*cmd_func) (int, char **, CassFs *);
                  } cmd_table[] = {
                  	{ "put",	PutCommand	},
                  	{ "get",	GetCommand	},
                  	{ "del",	DelCommand	},
                  	{ "mkfs",	MkfsCommand	},
                  	{ "mount",	MountCommand	},
                  	{ "mkdir",	MkdirCommand	},
                  	{ "rmdir",	RmdirCommand	},
                  	{ "list",	ListCommand	},
                  	{ "write",	WriteCommand	},
                  	{ "read",	ReadCommand	},
                  	{ "unlink",	UnlinkCommand	},
                  	{ "stat",	StatCommand	},
                  	{ "quit",	NULL		},
                  	{ NULL }
                  };
                  На ГК не тянет, не стал оформлять в виде отдельного поста
                  Ответить
                  • и в чем подвох?
                    Ответить
                    • подвоха нет, порадовало авторское _gcc_sucks. Говорю же, на ГК не тянет
                      Ответить
                      • понял
                        какая-нибудь древняя версия гцц не дала ему сделать анонимную структуру:
                        http://ideone.com/yWNWmM
                        Ответить
                  • > "quit", NULL
                    Выхода нет?
                    Ответить
                    • Выход в окно. (программа падает, пользователь все равно разницы не заметит)
                      Ответить
      • показать все, что скрытоЯ в Visual Studio 2010 компилировал. Рабоатет, через 5 секунд без ошибки вырубается)
        А варнинги я давно привык не читать, когда на чистом С пишу)
        Ответить
        • > А варнинги я давно привык не читать, когда на чистом С пишу)
          Ну зря, зря, там тем более их не так и много. Ну и в гцц даже на -Wall почти все ворнинги по делу. Разве что unused variable бесит.
          Ответить
          • -Wno-unused-variable
            Ответить
          • А что unused variable? Удалить ее и всех делов.
            Это в С++ часто бывает, что аргумент не используется в виртуальных функциях.
            Ответить
            • А из вызова зада как уберёшь?
              Ответить
              • h-файл
                class Class
                {
                    ...
                    virtual void method(int var);
                    ...
                };

                в cpp файле
                void Class::method(int)
                {
                
                }

                Хотя имя переменной можно убрать и h-файле, компилятору нужен лишь тип.
                Ответить
                • Не люблю убирать имя. Без имен аргументов код хуже читается. Имхо лучше дописать Q_UNUSED (если Qt), или закомментить это самое имя. Ну или как вариант - (void)name;
                  Ответить
                  • Использую (void)name;
                    Иногда список параметров с именами является частью макроса, который нельзя менять, потому что он в общем библиотеке.
                    Ответить
        • Минуснул за "варнинги не читаю".
          Ответить
        • silenter: варнинги я давно привык не читать, когда на чистом С пишу
          compiler: когда читаю программу С - пишу ворнинги (и не только)
          Ответить
        • Аналогично, с опцией -Werror варниги не читаю...
          Ответить
        • Чукча - писатель?
          Ответить

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