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

    Всего: 340

  2. Си / Говнокод #19760

    −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
    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
    printf(fmt,x1,x2,x3,x4,x5,x6,x7,x8,x9)
    	char fmt[];
    	{
    	extern printn, putchar;
    	char s[];
    	auto adx[], x, c;
    
    	adx = &x1; /* argument pointer */
    loop:
    	while((c = *fmt++) != '%') {
    		if(c == '\0')
    			return;
    		putchar(c);
    	}
    	x = *adx++;
    	switch (c = *fmt++) {
    
    	case 'd': /* decimal */
    	case 'o': /* octal */
    		if(x < 0) {
    			x = -x;
    			if(x<0) {  	/* is - infinity */
    				if(c=='o')
    					printf("100000");
    				else
    					printf("-32768");
    				goto loop;
    			}
    			putchar('-');
    		}
    		printn(x, c=='o'?8:10);
    		goto loop;
    
    	case 'c': /* char */
    		putchar(x);
    		goto loop;
    
    	case 's': /* string */
    		s = x;
    		while(c = *s++)
    			putchar(c);
    		goto loop;
    	}
    	putchar('%');
    	fmt--;
    	adx--;
    	goto loop;
    }

    from http://minnie.tuhs.org/cgi-bin/utree.pl?file=V2/lib/printf.c

    j123123, 06 Апреля 2016

    Комментарии (32)
  3. Куча / Говнокод #19677

    −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
    (* basic power axiom
    safe_comp_power x y =
        case
            (x = 0) and (y <> 0) -> 1
            (x = 1) -> x
            ((x <> 0) and (y >= 0)) or ((x = 0) and (y > 0)) -> x * (safe_comp_power x (y - 1))
    *)
    
    logic safe_comp_pow : int, int -> int
    
    axiom safe_comp_pow_int_A_1 : forall x : int. (x <> 0) -> safe_comp_pow(x, 0) = 1
    
    axiom safe_comp_pow_int_A_2 : forall x : int. safe_comp_pow(x, 1) = x
    
    axiom safe_comp_pow_int_A_3 : forall x,y : int. ((x <> 0) and (y >= 0)) or ((x = 0) and (y > 0)) -> safe_comp_pow(x, y) = x*(safe_comp_pow(x,y-1))
    
    
    goal g_1 :
      forall a,n : int.
      a <> 0 -> n >= 0 ->
      safe_comp_pow(a,n+1) = safe_comp_pow(a,n)*a

    Язык для SMT солвера alt-ergo https://alt-ergo.ocamlpro.com/try.php . Аксиомы для возведения в степень. Возводить в отрицательную степень нельзя. Ноль в степени ноль - нельзя. Логика первого порядка. Должна быть справедлива для целых. Правда в одной аксиоме я допустил баг. Я его уже нашел. Можете тоже попробовать найти его

    j123123, 22 Марта 2016

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

    −48

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    uint8_t n1[][2] = {{1,2}, {3,4}, {5,6}, {99,88}};
        uint8_t n2[][2] = {{7,8}, {9,10}, {11,12}, {99,88}};
        uint8_t n3[][2] = {{13,14}, {15,16}, {17,18}, {99,88}};
        
        // Надо сделать массив из указателей на двумерные массивы    
        uint8_t (*ars[3])[2] = { n1, n2, n3}; // полная херня, нечитаемо
        
        typeof( typeof(uint8_t [2]) *) ars2[3] = {n1, n2, n3}; // можно так
        
        typeof( typeof(uint8_t [2]) *[3]) ars3 = {n1, n2, n3}; // можно еще так
        
        typeof(uint8_t (*)[2]) ars4[3] = {n1, n2, n3}; // во, теперь заебись!

    Почему в Си так по-дебильному надо объявлять всякие массивы указателей на двумерные массивы и тому подобную херню? Через typeof получается куда понятней

    j123123, 14 Марта 2016

    Комментарии (66)
  5. Си / Говнокод #19491

    −48

    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
    /*
     * mfi_tbolt_adp_reset - For controller reset
     * @regs: MFI register set
     */
    int
    mfi_tbolt_adp_reset(struct mfi_softc *sc)
    {
    	int retry = 0, i = 0;
    	int HostDiag;
    
    	MFI_WRITE4(sc, MFI_WSR, 0xF);
    	MFI_WRITE4(sc, MFI_WSR, 4);
    	MFI_WRITE4(sc, MFI_WSR, 0xB);
    	MFI_WRITE4(sc, MFI_WSR, 2);
    	MFI_WRITE4(sc, MFI_WSR, 7);
    	MFI_WRITE4(sc, MFI_WSR, 0xD);
    
    	for (i = 0; i < 10000; i++) ;
    
    	HostDiag = (uint32_t)MFI_READ4(sc, MFI_HDR);
    
    	while (!( HostDiag & DIAG_WRITE_ENABLE)) {
    		for (i = 0; i < 1000; i++);
    		HostDiag = (uint32_t)MFI_READ4(sc, MFI_HDR);
    		device_printf(sc->mfi_dev, "ADP_RESET_TBOLT: retry time=%x, "
    		    "hostdiag=%x\n", retry, HostDiag);
    
    		if (retry++ >= 100)
    			return 1;
    	}
    
    	device_printf(sc->mfi_dev, "ADP_RESET_TBOLT: HostDiag=%x\n", HostDiag);
    
    	MFI_WRITE4(sc, MFI_HDR, (HostDiag | DIAG_RESET_ADAPTER));
    
    	for (i=0; i < 10; i++) {
    		for (i = 0; i < 10000; i++); // <--- двойной говнокод.
    	}
    
    	HostDiag = (uint32_t)MFI_READ4(sc, MFI_RSR);
    	while (HostDiag & DIAG_RESET_ADAPTER) {
    		for (i = 0; i < 1000; i++) ;
    		HostDiag = (uint32_t)MFI_READ4(sc, MFI_RSR);
    		device_printf(sc->mfi_dev, "ADP_RESET_TBOLT: retry time=%x, "
    		    "hostdiag=%x\n", retry, HostDiag);
    
    		if (retry++ >= 1000)
    			return 1;
    	}
    	return 0;
    }

    https://svnweb.freebsd.org/base/head/sys/dev/mfi/mfi_tbolt.c?view=markup&pathrev=235016#l 145
    Двойной говнокод. Мало того, что такие задержки на циклах попросту бесполезны, любой нормальный компилятор их выбросит при оптимизации, так там еще и ошибка с переиспользованием переменной i из внешнего цикла во внутреннем

    j123123, 19 Февраля 2016

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

    −43

    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 <inttypes.h>
    
    uint64_t pow_(uint64_t num, uint8_t pow)
    {
      static const void *array_pow[] = { &&l0, &&l1, &&l2, &&l3, &&l4, &&l5, &&l6,/* ....*/ };
      uint64_t ret = 1;
      goto *array_pow[pow];
      /* ... */
      l6: ret *=num;
      l5: ret *=num;
      l4: ret *=num;
      l3: ret *=num;
      l2: ret *=num;
      l1: ret *=num;
      l0:
      return ret;
    }

    Царский анролл возведения в степень через gcc-шные goto. Сам придумал. Но тут еще вот какая западня. Оптимизируется он хреново. Например, если взять возведение в степень 6 http://goo.gl/6SK2et
    то можно обойтись 3 инструкциями imul в то время как в хрени с метками их целых 6.

    j123123, 10 Февраля 2016

    Комментарии (70)
  7. 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)
  8. Си / Говнокод #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)
  9. Си / Говнокод #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)
  10. 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)
  11. Си / Говнокод #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)