Няшная / Говнокод #11988 Ссылка на оригинал

0

  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6
  7. 7
  8. 8
  9. 9
  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 silenter, (Updated )

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

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

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

Переведи на "PHP", guest!

    А не использовать ли нам bbcode?


    8