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

    Всего: 331

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

    −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
    Имеем приблизительно такой код
    
    #define XXX(n) ar[n]=s._field_##n;
    XXX(01);
    XXX(02);
    XXX(03);
    XXX(04);
    XXX(05);
    XXX(06);
    XXX(07);
    XXX(08);
    
    Естесвенно при при компиляции получаем ошибку, т.к. 08 это неправильная восмеричная константа. Обойти можно так
    
    #define XXX(n) ar[1##n-100]=s._field_##n;
    
    Но как-то это некрасиво. Может есть более красивый подход?

    https://www.linux.org.ru/forum/development/12607523

    j123123, 24 Июля 2016

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

    −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
    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
    Timer_Overflow_Interrupt(void)
    {
    switch(TMR_State)			// Обработчик прерывания по переполнению
    	{
    	case 0:	
    		{ 
    		Clr_Pin();		// Вывод в 0
    		TCNT = 255-100; 	// Задержка в 100 (до переполнения)
    		TMR_State = 1; 		// Следующая стадия 1
    		Break;			// Выход
    		}
     
    	case 1:	
    		{ 
    		Set_Pin();
    		TCNT = 255-1; 
    		TMR_State = 2; 
    		Break;
    		}
     
    	case 2:	
    		{ 
    		Clr_Pin();
    		TCNT = 255-5; 
    		TMR_State = 3; 
    		Break;
    		}
     
    	case 3:	
    		{ 
    		Set_Pin();
    		TCNT = 255-2; 
    		TMR_State = 4; 
    		Break;
    		}
     
    	case 4:	
    		{ 
    		Clr_Pin();
    		TCNT = 255-3; 
    		TMR_State = 5; 
    		Break;
    		}
     
    	case 5:	
    		{ 
    		Set_Pin();
    		TCNT = 255-4; 
    		TMR_State = 6; 
    		Break;
    		}
     
    	case 6:
    		{ 
    		Clr_Pin();
    		Timer_OFF(); 		// Выключаем таймер. Работа окончена
    		TMR_State = 0; 		// Обнуляем состояние
    		Break;			
    		}
     
    	default: 	break;		
    	}
    }

    http://easyelectronics.ru/avr-uchebnyj-kurs-konechnyj-avtomat.html

    А не лучше ли сделать массив указателей на функции, каждая из которых будет соответствовать case-у, и пусть там оно вызывает из массива фукнцию под номером TMR_State? Притом вот эту хню TMR_State = 1; TMR_State = 2; TMR_State = 3; которая дублируется во всех этих case-ах, ее ж можно хуйнуть всего один раз, типа TMR_State = (TMR_state+1)%7. Хотя для AVR контроллеров это скорее всего будет дорогая операция, так что можно хуйнуть TMR_State = TMR_state == 7 ? 0 : TMR_state+1;

    j123123, 20 Июля 2016

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

    −47

    1. 1
    while((*dst++ = *src++));

    двойные скобки, чтоб заткнуть ворнинг

    warning: suggest parentheses around assignment used as truth value [-Wparentheses]

    j123123, 08 Июля 2016

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

    −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
    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
    #include <stdio.h>
    #include <inttypes.h>
    
    #define REORDER3(b1,b2,b3,a1,a2,a3) do {uint32_t b1_tmp = a1; uint32_t b2_tmp = a2; b3 = a3; b1 = b1_tmp; b2 = b2_tmp;} while (0)
     
    void uintprint3(uint32_t *a)
    {
      printf("%u %u %u\n", a[0], a[1], a[2]);
    }
    
    void sort3(uint32_t a[3] )
    {
      if (a[0] > a[1])
      {
        if (a[1] > a[2])
        {
          REORDER3 (
            a[0], a[1], a[2],
            a[2], a[1], a[0]);
          return;
        }
        else
        {
          if (a[0] > a[2])
          {
            REORDER3 (
              a[0], a[1], a[2],
              a[1], a[2], a[0]);
            return;
          }
          else
          {
            REORDER3 (
              a[0], a[1], a[2],
              a[1], a[0], a[2]);
            return;
          }
        }
      }
      else
      {
        if (a[1] <= a[2])
        {
          return; //NO REORDER
        }
        else
        {
          if (a[0] <= a[2])
          {
            REORDER3 (
              a[0], a[1], a[2],
              a[0], a[2], a[1] );
            return;
          }
          else
          {
            REORDER3 (
              a[0], a[1], a[2],
              a[2], a[0], a[1] );
            return;
          }
        }
      }
    }
     
    int main(void)
    {
      uint32_t a[] = {0, 1, 2};
      uint32_t b[] = {0, 2, 1};
      uint32_t c[] = {1, 2, 0};
      uint32_t d[] = {1, 0, 2};
      uint32_t e[] = {2, 0, 1};
      uint32_t f[] = {2, 1, 0};
      sort3(a); sort3(b); sort3(c); sort3(d); sort3(e); sort3(f);
     
      uintprint3(a);
      uintprint3(b);
      uintprint3(c);
      uintprint3(d);
      uintprint3(e);
      uintprint3(f);
      return 0;
    }

    Вот как сортировать надо. А то всякие жабаскриптики http://govnokod.ru/20308 непонятные.

    Это говно кстати можно автосгенерировать для произвольной длины, но мне что-то западло этим заниматься

    j123123, 01 Июля 2016

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

    −47

    1. 1
    http://ache.vniz.net/demos.html

    > Cвоеобразный программисткий подвиг совершил Дима Бурков. В то время начали появляться первые PC. Unix на них выглядел неубедительно. Linux еще не появился, зато повился Venix. Хачить его было невозможно - не было исходных текстов ядра. Дима Бурков реассемблировал ядро, потом писал программы на Си, которые давали тот же текст ассемблера - так появились тексты ядра на Си ... работа не для слабонервных.

    А вот интересно, можно ли сделать декомпилятор таким способом? Например, если известна точная версия GCC и флаги компиляции, которые использовались (ну и естественно исходники компилятора должны быть в наличии) то перебирать с эвристиками некий Си-код, пользуясь дизасм-листингом для подсказки и сравнения. Какой подход использует Hex-Rays например? Вряд ли они исходники GCC ковыряли

    j123123, 28 Июня 2016

    Комментарии (12)
  7. Си / Говнокод #20245

    −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
    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
    //                   ПРЕОБРАЗОВАНИЕ КОДА И КОНЕЧНЫЕ АВТОМАТЫ
    //                   ---------------------------------------
    //               (проектируем очень хуево дизассемблируемый код)
    
    int T[256] =
    {
      4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
      //                      , -      0 1 2 3 4 5 6 7 8 9
      0,0,0,0,0,0,0,0,0,0,0,0,2,3,0,0, 1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,
      0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
      0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
      0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
      0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
      0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
      0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
    };
    
    for(;;)
    {
      int A;
      switch( S )
      {
        case 0:
                switch( T[*c] )
                {
                  case 1:  { S=1; A=1; }; break;
                  default: { S=5; A=2; }; break;
                }
                break;
        case 1:
                switch( T[*c] )
                {
                  case 2:  { S=0; A=2; }; break;
                  case 1:  { S=1; A=3; }; break;
                  case 3:  { S=2;      }; break;
                  case 4:  { S=4; A=2; }; break;
                  case 0:  { S=5;      }; break;
                }
                break;
        case 2:
                switch( T[*c] )
                {
                  case 1:  { S=3; A=4; }; break;
                  default: { S=5;      }; break;
                }
                break;
        case 3:
                switch( T[*c] )
                {
                  case 2:  { S=0; A=5; }; break;
                  case 1:  { S=3; A=6; }; break;
                  case 4:  { S=4; A=5; }; break;
                  default: { S=5;      }; break;
                }
                break;
        case 4:
                A = 7;
                break;
        case 5:
                A = 8;
                break;
      }
      switch( A )
      {
        case 1: { l=*c-'0';      c++; }; break;
        case 2: { store(l,l);    c++; }; break;
        case 3: { l=l*10+*c-'0'; c++; }; break;
        case 4: { h=*c-'0';      c++; }; break;
        case 5: { store(l,h);    c++; }; break;
        case 6: { h=h*10+*c-'0'; c++; }; break;
        case 7: { exit();             }; break;
        case 8: { error();            }; break;
      }
    }

    http://z0mbie.daemonlab.org/automaton.txt отсюда

    Мне это напомнило вот эту вот ебанутейшую хуиту https://src.chromium.org/viewvc/native_client/trunk/src/native_client/src/trusted/validator_ragel/gen/validator_x86_64.c из хрома, которая делает валидацию опкодов из-под NaCl, его через какой-то ragel делают

    j123123, 22 Июня 2016

    Комментарии (15)
  8. Assembler / Говнокод #20234

    +70

    1. 1
    https://youtu.be/hB6eY73sLV0?t=241

    Исполнение произвольного кода(в данном случае Flappy Bird) в Super Mario World. Запись инструкций в память происходит посредством прыжков в нужных координатах.

    j123123, 20 Июня 2016

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

    −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
    int hardinfo_updata( struct UPINFO * headinfo, struct HARDINFO * hardinfo )
    {
    	char sbuf[128] ;
    	int sn_len = 0 ;
    	char *psn ;
    	
    	printf("%s\n",__FUNCTION__  ) ;
    	memset( sbuf, 0xFF, 128 ) ;
    	if( strcmp( hardinfo->flag, "hardinfo") != 0 )
    	{
    		psn = (char *)hardinfo ;
    		sn_len = *psn ;
    		psn += 1;
    		memcpy( sbuf, psn , 127 ) ;
    	}
    	else
    	{
    		sn_len = hardinfo->sn_len ;
    		memcpy(sbuf, hardinfo->sn, 128 ) ;
    	}
    
    	memcpy( hardinfo, &(headinfo->hardinfo), sizeof( struct HARDINFO ) ) ;
    	hardinfo->sn_len = sn_len ;
    	if( hardinfo->sn_len > 128 ) hardinfo->sn_len = 128 ;
    	memcpy( hardinfo->sn, sbuf, hardinfo->sn_len ) ;
    	
    	memset( 0x30008000, 0xFF, 0x20000 ) ;
    	memcpy( 0x30008000, hardinfo, sizeof( struct HARDINFO ) ) ;
    	memset( sbuf, 0xFF, 128 ) ;
    	sprintf( sbuf, "%s %x %x\0", "nand erase 80000 80000 ;nand write 0x30008000", 0x80000, 0x20000) ;
    	run_command( sbuf,0);
    
    	memset( sbuf, 0, 128 ) ;
    	sprintf( sbuf, "%s %x\0", "nand read  0x31000000 80000 ", 0x20000 ) ;
    	run_command(sbuf, 0 ) ;
    
    	if( memcmp( 0x30008000, 0x31000000, sizeof( struct HARDINFO) ) != 0 )
    	{
    		printf("bootloader data crc error\n") ;
    		return 0 ;
    	}
    	else
    	{
    		printf("update hardinfo is ok\n") ;
    	}
    
    	return 1 ;
    }

    CRC через memcpy. Из пропатченного китайцами u-boot

    j123123, 15 Июня 2016

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

    −49

    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
    bool decode_hex(void *p, size_t max_len, const char *hexstr, size_t *out_len_)
    {
    static const unsigned char hexdigit_val[256] = {
            ['0'] = 0,
            ['1'] = 1,
            ['2'] = 2,
            ['3'] = 3,
            ['4'] = 4,
            ['5'] = 5,
            ['6'] = 6,
            ['7'] = 7,
            ['8'] = 8,
            ['9'] = 9,
            ['a'] = 0xa,
            ['b'] = 0xb,
            ['c'] = 0xc,
            ['d'] = 0xd,
            ['e'] = 0xe,
            ['f'] = 0xf,
            ['A'] = 0xa,
            ['B'] = 0xb,
            ['C'] = 0xc,
            ['D'] = 0xd,
            ['E'] = 0xe,
            ['F'] = 0xf,};
    
            if (!p || !hexstr)
                    return false;
            if (!strncmp(hexstr, "0x", 2))
                    hexstr += 2;
            if (strlen(hexstr) > (max_len * 2))
                    return false;
    
            unsigned char *buf = p;
            size_t out_len = 0;
    
            while (*hexstr) {
                    unsigned char c1 = (unsigned char) hexstr[0];
                    unsigned char c2 = (unsigned char) hexstr[1];
    
                    unsigned char v1 = hexdigit_val[c1];
                    unsigned char v2 = hexdigit_val[c2];
    
                    if (!v1 && (c1 != '0'))
                            return false;
                    if (!v2 && (c2 != '0'))
                            return false;
    
                    *buf = (v1 << 4) | v2;
    
                    out_len++;
                    buf++;
                    hexstr += 2;
            }
    
            if (out_len_)
                    *out_len_ = out_len;
            return true;
    }

    https://gist.github.com/aido/9490244#file-der_test-L16 оптимизция!

    j123123, 09 Июня 2016

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

    −49

    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
    91. 91
    92. 92
    93. 93
    94. 94
    95. 95
    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    
    
    int digits(char **arr_ptr, void **func_ptr)
    {
    	char *a = *arr_ptr;
    	if (*a == '9')
    	{
    		if ( *(func_ptr-1) == NULL )
    		{
    			return 0;
    		}
    		else
    		{
    			*a = '0';
    			return ( *(int(*)(char **, void **)) *(func_ptr-1) )(arr_ptr-1,func_ptr-1);
    		}
    	}
    	(*a)++;
    	return 1;
    }
    
    int az_AZ(char **arr_ptr, void **func_ptr)
    {
    	char *a = *arr_ptr;
    	if (*a == 'z')
    	{
    		*a = 'A';
    		return 1;
    	}
    	if (*a == 'Z')
    	{
    		if ( *(func_ptr-1) == NULL )
    		{
    			return 0;
    		}
    		else
    		{
    			*a = 'a';
    			return ( *(int(*)(char **, void **)) *(func_ptr-1) )(arr_ptr-1,func_ptr-1);
    		}
    	}
    	(*a)++;
    	return 1;
    }
    
    
    int main(void)
    {
    	char a[] = "$#hui"; // $ - azAZ ; # - 1234567890
    	size_t len = strlen(a);
    
    	char **char_ptr_arr = malloc(sizeof(char *) * len);
    	char **char_ptr_arr_p = char_ptr_arr;
    
    	void **func_ptr = malloc(sizeof(void *) * (len+1));
    	func_ptr[0] = NULL;
    	void **func_ptr_p = func_ptr+1;
    
    
    	char *i = a;
    	while (*i != 0)
    	{
    		if (*i == '$')
    		{
    			*char_ptr_arr_p = i;
    			char_ptr_arr_p++;
    			*func_ptr_p = (void *)az_AZ;
    			func_ptr_p++;
    			*i = 'a';
    		}
    		else if (*i == '#')
    		{
    			*char_ptr_arr_p = i;
    			char_ptr_arr_p++;
    			*func_ptr_p = (void *)digits;
    			func_ptr_p++;
    			*i = '0';
    		}
    		i++;
    	}
    
    	printf("%s ", a);
    	while (( *(int(*)(char **, void **)) *(func_ptr_p-1) )(char_ptr_arr_p-1,func_ptr_p-1) != 0 )
    	{
    		printf("%s ", a);
    	}
    	printf("%s\n", a);
    	fflush(stdout);
    	free(char_ptr_arr);
    	free(func_ptr);
    	return 0;
    }

    Перебиралка всех кобенаций паролей по маске на сишке, где функции через стек из указателей на функции друг друга вызывают через воиды.

    http://govnokod.ru/20137#comment333406 отсюда:
    Надо конечно typedef всунуть для функции, но там жопа с рекурсивным определением функции X = (int()(char **, X **))
    По сути, надо чтобы функция в качестве аргумента принимала указатель того же типа, что и та сама функция, а такое рекурсивное определение типа в Си нельзя делать

    j123123, 06 Июня 2016

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