1. Список говнокодов пользователя j123123

    Всего: 335

  2. Assembler / Говнокод #19395

    +76

    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
    26. 26
    27. 27
    28. 28
    29. 29
    30. 30
    .global	shit
    	.type	shit, @function
    shit:
    /* prologue: function */
    /* frame size = 0 */
    /* stack size = 0 */
    .L__stack_usage = 0
    	mov r30,r24
    	mov r31,r25
    	ldd r18,Z+1
    	ldd r22,Z+2
    	mov r24,r22
    	ldi r25,0
    	ldi r26,0
    	ldi r27,0
    	mov r26,r24
    	mov r27,r25
    	clr r25
    	clr r24
    	or r25,r18
    	ld r18,Z
    	or r24,r18
    	ldd r18,Z+3
    	mov r22,r24
    	mov r23,r25
    	mov r24,r26
    	mov r25,r27
    	or r25,r18
    	ret
    	.size	shit, .-shit

    Вот такое ГЛОБАЛЬНОЕ ГОВНО мне делает GCC под AVR
    Код разворота байтиков:

    unsigned long int shit(unsigned char *a)
    {
    return
    ( unsigned long int)a[0] << 0 |
    ((unsigned long int)a[1] << 8 ) |
    ((unsigned long int)a[2] << 16) |
    ((unsigned long int)a[3] << 24);
    }

    Вот другие попытки это сделать, чтоб компилятор сделал более оптимально http://goo.gl/3D2Lri - ссылка на gcc.godbolt.org

    У меня есть собранный через crosstools-ng более новый gcc под AVR, вот выхлоп с него для тех же примеров, что и в godbolt https://paste.debian.net/378491/

    Там __builtin_bswap32() становится rcall __bswapsi2, но этот __bswapsi2 состоит из двух сраных инструкций
    gcc/libgcc/config/avr/lib1funcs.S
    #if defined (L_bswapsi2)
    ;; swap bytes
    ;; r25:r22 = bswap32 (r25:r22)
    DEFUN __bswapsi2
    bswap r22, r25
    bswap r23, r24
    ret
    ENDF __bswapsi2
    #endif /* defined (L_bswapsi2) */

    ТАК ПОЧЕМУ Б ТУПО НЕ ЗАИНЛАЙНИТЬ ЭТО?

    j123123, 04 Февраля 2016

    Комментарии (38)
  3. Си / Говнокод #19383

    −50

    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
    26. 26
    27. 27
    28. 28
    29. 29
    30. 30
    31. 31
    32. 32
    33. 33
    34. 34
    35. 35
    36. 36
    37. 37
    38. 38
    39. 39
    40. 40
    41. 41
    42. 42
    43. 43
    44. 44
    45. 45
    46. 46
    47. 47
    #define OP(a,b,op) ((a)op(b))
    
    #define MKFUNC_a_op_b(type, opname, op) void type##_##opname##_##type(const void *a, const void *b, void *out) \
    {\
      type tmp =  OP(*(type*)a,*(type*)b,op);\
      memcpy(out,(void*)(&tmp),sizeof(type));\
    }
    
    #define MKALLF_int(type) \
    MKFUNC_a_op_b(type,plus,+) MKFUNC_a_op_b(type,minus,-) \
    MKFUNC_a_op_b(type,div,/) MKFUNC_a_op_b(type,mod,%) \
    MKFUNC_a_op_b(type,and,&) MKFUNC_a_op_b(type,or,|) \
    MKFUNC_a_op_b(type,xor,^)
    
    MKALLF_int(int8_t)
    MKALLF_int(uint8_t)
    MKALLF_int(int16_t)
    MKALLF_int(uint16_t)
    MKALLF_int(int32_t)
    MKALLF_int(uint32_t)
    MKALLF_int(int64_t)
    MKALLF_int(uint64_t)
    
    #define MKFUNC_conv_t(type1, type2) void type1##_to_##type2(const void *a, void *out) \
    {\
      type2 tmp = (type2)(*(type1*)a);\
      memcpy(out,(void*)(&tmp),sizeof(type2));\
    }
    
    #define MKFUNC_con_M(type) \
    MKFUNC_conv_t(type, int8_t) \
    MKFUNC_conv_t(type, uint8_t) \
    MKFUNC_conv_t(type, int16_t) \
    MKFUNC_conv_t(type, uint16_t) \
    MKFUNC_conv_t(type, int32_t) \
    MKFUNC_conv_t(type, uint32_t) \
    MKFUNC_conv_t(type, int64_t) \
    MKFUNC_conv_t(type, uint64_t)
    
    MKFUNC_con_M(int8_t)
    MKFUNC_con_M(uint8_t)
    MKFUNC_con_M(int16_t)
    MKFUNC_con_M(uint16_t)
    MKFUNC_con_M(int32_t)
    MKFUNC_con_M(uint32_t)
    MKFUNC_con_M(int64_t)
    MKFUNC_con_M(uint64_t)

    Это я типа такую заготовку для стековой ВМ делаю, определяю операции(инструкции) для опкодов кагбэ. Потом у меня там будет массив указателей на функции, ну и я их буду вызывать, пропихивая аргументы. Но похоже что сишный препроцессор это говно полное, и надо кодогеренератор для набора такой ерунды делать.

    j123123, 02 Февраля 2016

    Комментарии (20)
  4. Си / Говнокод #19367

    −47

    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
    #include <stdio.h>
    #include <inttypes.h>
    
    typedef struct {uint32_t dummy;} str32;
    
    int main (void)
    {
        // тут получаются нули
        printf("%zu\n", sizeof( struct {uint32_t;} ) );
        printf("%zu\n", sizeof( (struct {uint32_t;}){} ) );
        
    
        // а тут получаются 4 как и планировалось
        printf("%zu\n", sizeof( str32 ) );
        printf("%zu\n", sizeof(uint32_t) );
        return 0;
    }

    Попытки получить размер анонимной структуры. Компиляторы clang gcc icc под линупсом почему-то возвращают 0. Не может же это быть багом сразу в трех компиляторах?

    j123123, 29 Января 2016

    Комментарии (13)
  5. C++ / Говнокод #19340

    0

    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
    26. 26
    27. 27
    #define EncryptAES256(sched) \
    		"pxor (%["#sched"]), %%xmm0 \n" \
    		"aesenc	16(%["#sched"]), %%xmm0 \n" \
    		"aesenc	32(%["#sched"]), %%xmm0 \n" \
    		"aesenc	48(%["#sched"]), %%xmm0 \n" \
    		"aesenc	64(%["#sched"]), %%xmm0 \n" \
    		"aesenc	80(%["#sched"]), %%xmm0 \n" \
    		"aesenc	96(%["#sched"]), %%xmm0 \n" \
    		"aesenc	112(%["#sched"]), %%xmm0 \n" \
    		"aesenc	128(%["#sched"]), %%xmm0 \n" \
    		"aesenc	144(%["#sched"]), %%xmm0 \n" \
    		"aesenc	160(%["#sched"]), %%xmm0 \n" \
    		"aesenc	176(%["#sched"]), %%xmm0 \n" \
    		"aesenc	192(%["#sched"]), %%xmm0 \n" \
    		"aesenc	208(%["#sched"]), %%xmm0 \n" \
    		"aesenclast	224(%["#sched"]), %%xmm0 \n"
    		
    	void ECBEncryptionAESNI::Encrypt (const ChipherBlock * in, ChipherBlock * out)
    	{
    		__asm__
    		(
    			"movups	(%[in]), %%xmm0 \n"
    			EncryptAES256(sched)
    			"movups	%%xmm0, (%[out]) \n"	
    			: : [sched]"r"(GetKeySchedule ()), [in]"r"(in), [out]"r"(out) : "%xmm0", "memory"
    		);
    	}

    https://github.com/PurpleI2P/i2pd/blob/openssl/Crypto.cpp принципиально новый подход - определять дефайном какое-то макроговно, чтобы потом его использовать внутри асмовставок

    j123123, 22 Января 2016

    Комментарии (9)
  6. Си / Говнокод #19299

    −44

    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
    26. 26
    27. 27
    28. 28
    29. 29
    30. 30
    31. 31
    32. 32
    33. 33
    34. 34
    35. 35
    36. 36
    37. 37
    38. 38
    39. 39
    40. 40
    41. 41
    42. 42
    43. 43
    44. 44
    45. 45
    46. 46
    47. 47
    48. 48
    49. 49
    50. 50
    51. 51
    52. 52
    53. 53
    54. 54
    55. 55
    56. 56
    57. 57
    58. 58
    59. 59
    60. 60
    61. 61
    62. 62
    63. 63
    64. 64
    65. 65
    66. 66
    67. 67
    68. 68
    69. 69
    70. 70
    71. 71
    72. 72
    73. 73
    74. 74
    75. 75
    76. 76
    77. 77
    78. 78
    79. 79
    80. 80
    81. 81
    82. 82
    83. 83
    84. 84
    85. 85
    86. 86
    87. 87
    88. 88
    89. 89
    90. 90
    #include <stdio.h>
    #include <stdlib.h>
    
    
    void push(unsigned int a, unsigned int **stackpp)
    {
        **stackpp = a;
        (*stackpp)++;
    }
    
    unsigned int pop(unsigned int **stackpp)
    {
        (*stackpp)--;
        return **stackpp;
    }
    
    unsigned int fib(unsigned int a)
    {
        unsigned int stack[10000] = {0};
        unsigned int *stackp = stack;
        
        // локальные дефайны
        #define PUSH(x) push(x, &stackp)
        #define POP() pop(&stackp)
        
        relative_label:    
        PUSH( (int)(&&result - &&relative_label ) );
        PUSH(a);
        goto shit;
        result:
        return POP();
        
        shit:
        while(stackp != stack)
        {
            unsigned int tmp = POP();
            //printf("tmp = %u\n", tmp); отладочная перчать
            fflush(stdout);
            if (tmp == 0)
            {
                int _ret = POP();
                PUSH(0);
                goto *(&&relative_label + _ret);
            }
            else if (tmp == 1)
            {
                int _ret = POP();
                PUSH(1);
                goto *(&&relative_label + _ret);
            }
            else
            {
                PUSH(tmp-2); // предварительно сохраняем
                PUSH( (int)(&&after_p1 - &&relative_label) );
                PUSH(tmp-1);
                continue;
                
                after_p1: ;
                unsigned int tmp1 = POP(); // возвращенное значение
                unsigned int tmp2 = POP(); // предварительно сохраненное
                PUSH(tmp1);
                PUSH( (int)(&&after_p2 - &&relative_label) );
                PUSH(tmp2);
                continue;
                
                after_p2: ;
                unsigned int val = POP()+POP();
                int _ret = POP();
                PUSH(val);
                goto *(&&relative_label + _ret);
            }
        }
        // ERROR - стек размотался. Такого быть не должно
        exit(-1);
        
        // убираем локальные дефайны
        #undef PUSH 
        #undef POP
    }
    
    
    int main(void)
    {
    
        for(unsigned int i = 0; i < 30; i++)
        {
            printf("%u ", fib(i));
        }
        return 0;
    }

    Этим кодом я доказывал одному типу какой-то бред, связанный с рекурсией. Типа он считал что ее нельзя реализовать через сраные циклы со стеком(или может просто хотел посмотреть на такую реализацию).
    Надо короче сделать локальный #define чтобы он автоматически #undef при выходе из области видимости фукнции.

    j123123, 13 Января 2016

    Комментарии (18)
  7. Pascal / Говнокод #19289

    −46

    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
    свежий 0дэй сплоит для вороства денег с лоховского аккаунта на e-gold
    сплоит сам находит лоховской акк и переводит деньги хакеру
    
    компилировать паскалем 4.0
    
    опытный хакер сам найдет ошибки и исправит их
    это приватная версия сплоита, просьба не распростронять вне форума!!!
    
    programm 0day_egold_back_sploit
    var
    babki:longint;
    begin
    connect("e-gold.com",80);
    goto("money.hmtl");
    authorize(steal(random,"login"),steal(random,"password"));
    transfer(babki,fucked_login,hacker_login);
    writeln("Loh has been hacked!");
    disconnect;
    end.

    http://bh-crew.livejournal.com/9875.html

    j123123, 11 Января 2016

    Комментарии (18)
  8. Си / Говнокод #19280

    −1

    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
    26. 26
    27. 27
    28. 28
    29. 29
    30. 30
    31. 31
    32. 32
    33. 33
    34. 34
    35. 35
    36. 36
    37. 37
    38. 38
    39. 39
    40. 40
    41. 41
    42. 42
    43. 43
    44. 44
    45. 45
    46. 46
    47. 47
    48. 48
    49. 49
    50. 50
    51. 51
    52. 52
    53. 53
    54. 54
    55. 55
    56. 56
    57. 57
    58. 58
    59. 59
    60. 60
    61. 61
    62. 62
    63. 63
    64. 64
    65. 65
    66. 66
    67. 67
    68. 68
    69. 69
    70. 70
    71. 71
    72. 72
    73. 73
    74. 74
    75. 75
    76. 76
    77. 77
    78. 78
    79. 79
    80. 80
    81. 81
    82. 82
    83. 83
    84. 84
    // Add a UPnP port
    bool Win32UPnPAddPort(UINT outside_port, UINT inside_port, bool udp, char *local_ip, wchar_t *description, bool remove_before_add)
    {
    	bool ret = false;
    	HRESULT hr;
    	IUPnPNAT *nat = NULL;
    	wchar_t ip_str[MAX_SIZE];
    	BSTR bstr_ip, bstr_description, bstr_protocol;
    	wchar_t *protocol_str = (udp ? L"UDP" : L"TCP");
    	// Validate arguments
    	if (outside_port == 0 || outside_port >= 65536 || inside_port == 0 || inside_port >= 65536 ||
    		IsEmptyStr(local_ip) || UniIsEmptyStr(description))
    	{
    		return false;
    	}
    
    	StrToUni(ip_str, sizeof(ip_str), local_ip);
    	bstr_ip = SysAllocString(ip_str);
    	bstr_description = SysAllocString(description);
    	bstr_protocol = SysAllocString(protocol_str);
    
    	hr = CoCreateInstance(CLSID_UPnPNAT, NULL, CLSCTX_INPROC_SERVER, IID_IUPnPNAT, (void **)&nat);
    
    	if (SUCCEEDED(hr))
    	{
    		if (nat != NULL)
    		{
    			IStaticPortMappingCollection *collection = NULL;
    			hr = nat->get_StaticPortMappingCollection(&collection);
    
    			if (SUCCEEDED(hr))
    			{
    				if (collection != NULL)
    				{
    					IStaticPortMapping *mapping = NULL;
    
    					if (remove_before_add)
    					{
    						hr = collection->Remove((long)outside_port, bstr_protocol);
    					}
    
    					hr = collection->Add((long)outside_port, bstr_protocol, (long)inside_port,
    						bstr_ip, VARIANT_TRUE, bstr_description, &mapping);
    
    					if (SUCCEEDED(hr))
    					{
    						ret = true;
    
    						if (mapping != NULL)
    						{
    							mapping->Release();
    						}
    					}
    
    					collection->Release();
    				}
    				else
    				{
    					WHERE;
    				}
    			}
    			else
    			{
    				WHERE;
    			}
    
    			nat->Release();
    		}
    		else
    		{
    			WHERE;
    		}
    	}
    	else
    	{
    		WHERE;
    	}
    
    	SysFreeString(bstr_ip);
    	SysFreeString(bstr_description);
    	SysFreeString(bstr_protocol);
    
    	return ret;
    }

    Отсюда https://github.com/SoftEtherVPN/SoftEtherVPN/blob/master/src/Cedar/Win32Com.cpp#L157
    Там еще много такого. https://github.com/SoftEtherVPN/SoftEtherVPN/blob/master/src/Cedar/Win32Com.cpp#L963 вот например тоже забавная хрень. Нашел эту штуку по ссылке с говнохабра http://habrahabr.ru/post/208782/

    j123123, 04 Января 2016

    Комментарии (9)
  9. Java / Говнокод #19142

    −32

    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
    MethodHandle mov256MH = CodeSnippet.make("move256",
         MethodType.methodType(void.class,            // return type
                               Object.class /*rdi*/,  // src
                               long.class   /*rsi*/,  // offset
                               Object.class /*rdx*/,  // dst
                               long.class   /*rcx*/), // offset
         CPUID.has(AVX),
         0xC4, 0xE1, 0x7E, 0x6F, 0x04, 0x37,  // vmovdqu ymm0,[rsi+rdi]
         0xC4, 0xE1, 0x7E, 0x7F, 0x04, 0x0A); // vmovdqu [rdx+rcx],ymm0
    
    
       static void move256(Object src, long off1, Object dst, long off2) {
           try {
               mov256MH.invokeExact(src, off1, dst, off2);
           } catch (Throwable e) {
               throw new Error(e);
           }
       }
    
       byte[] src = ...; long off1 = ...;
       byte[] dst = ...; long off2 = ...;
       move256(src, off1, dst, off2);

    Вставка машинного кода (прямо как в http://govnokod.ru/19017 ) теперь и в Java
    http://mail.openjdk.java.net/pipermail/panama-dev/2015-December/000225.html

    j123123, 06 Декабря 2015

    Комментарии (76)
  10. Си / Говнокод #19119

    −98

    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
    26. 26
    27. 27
    28. 28
    29. 29
    30. 30
    31. 31
    32. 32
    33. 33
    34. 34
    35. 35
    36. 36
    37. 37
    38. 38
    39. 39
    40. 40
    41. 41
    42. 42
    43. 43
    44. 44
    45. 45
    46. 46
    47. 47
    48. 48
    49. 49
    50. 50
    51. 51
    52. 52
    53. 53
    54. 54
    55. 55
    56. 56
    57. 57
    58. 58
    59. 59
    60. 60
    61. 61
    62. 62
    63. 63
    64. 64
    65. 65
    66. 66
    67. 67
    68. 68
    69. 69
    70. 70
    71. 71
    72. 72
    73. 73
    74. 74
    void *_band_get_aligned(Band *p, size_t alignment, size_t size)
    {
    	Block     *which;
    	ListNode  *x;
    
    	if (!__mallocsizes_inited) {
    		__malloc_sizes_init();
    	}
    	assert(size <= p->nbpe);
    	if (alignment != _MALLOC_ALIGN) {
    		size_t esize = p->nbpe + SB_OVERHEAD();
    		size_t	   dividend = (alignment / esize);
    		assert(alignment >= _MALLOC_ALIGN);
    
    		if (dividend > p->nalloc
    			|| (alignment != _MALLOC_ALIGN 
          && dividend * esize != alignment)) { /* not an even multiple */
    			errno = EINVAL;
    			return NULL;
    		}
    	}
    
    	if ((which = p->alist) != NULL) {
    		if (alignment != _MALLOC_ALIGN) {
    			x = (ListNode *)_block_memalign(p, which, alignment);
    		}
    		else {
    			x = (ListNode *)_block_mem_malloc_align(p, which);
    		}
    		if (x != NULL) {
    #ifdef STATISTICS
    			p->alloc_counter++;
    #endif
    			x->ln_offset = (char *)which - (char *)x;
    			assert(x->ln_offset < 0);
    			assert(which->navail > 0);
    
    			/*
    		 	* If no more blocks, put this on the depleted-list
    		 	*/
    			if (--which->navail == 0) {
    				Block        *b;
    
    				assert(which->head == NULL);
    				assert(which->prev == NULL);
    
    				/*
    			 	* Simple delete -- which is first.
    			 	*/
    				p->alist = b = which->next;
    				if (b)
    					b->prev = NULL;
    
    				/*
    			 	* insert into d(epleted)list
    			 	*/
    				which->next = b = p->dlist;
    				p->dlist = which;
    				if (b)
    					b->prev = which;
    			}
    			_malloc_stats.m_small_allocmem += p->nbpe;
    			_malloc_stats.m_small_freemem -= p->nbpe;
    
    			return x+1;
    		}
    	}
    
    	if ((which = band_addblk(p)) == NULL) {
    		return 0; /* failed */
    	}
    	assert(which->navail);
    	return _band_get_aligned(p, alignment, size);
    }

    [color=blue]http://sourceforge.net/p/monartis/openqnx/ci/master/tree/trunk/lib/c/alloc/band.c#l346[color] - рекурсия в аллокаторе QNX. Некоторые компиляторы эту рекурсию оптимизируют, некоторые - нет. И когда не оптимизируют, она способна при определенных условия выжрать стек, что приводит к сегфолту, например как тут [color=blue]http://www.openqnx.com/phpbbforum/viewtopic.php?f=7&t=12896&view=print[color]

    j123123, 02 Декабря 2015

    Комментарии (10)
  11. Си / Говнокод #19117

    −100

    1. 1
    https://youtu.be/sm-W4Tzg9-o?t=692

    Анимированные 3D модели в С коде. К сожалению, передать это в виде текста не представляется возможным.

    j123123, 01 Декабря 2015

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