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

    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
    28. 28
    29. 29
    switch (k) {
    ........
                case DN:
                    if (mnu_cnt != (cnt - 1)) goto Do_Ent_Key;
                    break;
            }
            if (k == HOME || k == END || k == RIGHT || k == LEFT) {
                local_out_str(s_menu[mnu_old].menu_name, x + pos[mnu_old], y + 1, s_menu[mnu_old].len, color_item);
                local_out_str(s_menu[mnu_cnt].menu_name, x + pos[mnu_cnt], y + 1, s_menu[mnu_cnt].len, color_sel);
    
                if (s_menu[mnu_cnt].id_exe == 0 && Action != 0)  goto Do_Ent_Key;
            }
    .........
            switch (i) {
                case ENT:
                    if (mnu_cnt == (cnt - 1)) {
                        i = 'Q';
                        break;
                    }
    ............
                    Do_Ent_Key:
                        if (s_menu[mnu_cnt].id_exe == 0) {
                            strncpy(st1, s_menu[mnu_cnt].level, 7);
                            len = st_l(st1, 7);
                            st1[len] = '0';
                        }
    ............
                        break;
            }

    rjhdby, 20 Июля 2016

    Комментарии (1)
  2. Си / Говнокод #20382

    +5

    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
    #define _GNU_SOURCE
    
    #include <ucontext.h>
    #include <unistd.h>
    #include <signal.h>
    #include <stdio.h>
    #include <string.h>
    
    volatile void *retry_address = NULL;
    volatile int *value = NULL;
    int value_holder = 5;
    #define debug_write(MESSAGE) write(1, MESSAGE, sizeof(MESSAGE) - 1)
    
    #if defined(REG_RIP)
    #define REG_IP REG_RIP
    #elif defined(REG_EIP)
    #define REG_IP REG_EIP
    #else
    #error Intel only!
    #endif
    
    void segv_handler(int signum, siginfo_t *info, void *ucontext_ptr)
    {
    	debug_write("You forgot to allocate your memory? Let's try again.\n");
    	value = &value_holder;
    	ucontext_t *ucontext = ucontext_ptr;
    	ucontext->uc_mcontext.gregs[REG_IP] = (greg_t)retry_address;
    }
    
    int main()
    {
    	__label__ retry_label;
    	retry_address = &&retry_label;
    	struct sigaction action;
    	memset(&action, 0, sizeof(action));
    	action.sa_sigaction = segv_handler;
    	action.sa_flags = SA_SIGINFO;
    	if (sigaction(SIGSEGV, &action, NULL) < 0)
    	{
    		perror("sigaction()");
    	}
    retry_label:
    	debug_write("Trying to access *value...\n");
    	printf("The *value is %d\n", *value);
    	return 0;
    }

    К недавнему вопросу о восстановлении после SIGSEGV.
    http://ideone.com/l5pWVp

    Bobik, 15 Июля 2016

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

    −1

    1. 1
    2. 2
    3. 3
    4. 4
    5. 5
    6. 6
    7. 7
    8. 8
    9. 9
    int strtonum(const char str[]){
        bool minus = *str=='-';
        if(minus)++str;
        int res=0;
        while(*str)
            res=(res<<3)+(res<<1)+*str++-'0';
        if(minus)return ~res+1;
        return res;
    }

    Пробный говнокод, не знаю степень его !годности.

    cheburum, 10 Июля 2016

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

    +3

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

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

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

    j123123, 08 Июля 2016

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

    +7

    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
    Жила-была маленькая либа для некого специфического IPC c Erlang, которую использовали почти все приложениями на большом-пребольшом 
    кластере. Писалась она во времена, когда эрланг был медленным и на прологе писаным. Использовалась приложениями она как-то так:
    
    ...
    libFoo_initialize();
    for(int i = 0; i<9001; i++) {
        libFoo_registerStuff(bar[i]);
    }
    continue_my_own_business_logic();
    ...
    
    В этом году обнаружили мы странный разброс нагрузки на разных узлах кластера. Профилировали-профилировали, да нашли следующее:
    
    void libFoo_initialize(void) 
    {
       do_stuff();
       int nap = srand(5);
       /* Load balancing, prevent simultaneous registration: */
       sleep(nap);
    }
    
    Таким образом, наша маленькая либа балансировала нагрузку этого кластера, полного матанных приложений, сложной контрольной логики и 
    fault-tolerance питушни, десятки лет! Само собой, это никто выпиливать не решился, и фикс был следующим:
    
    void libFoo_initialize2(void (*callback)(void))
    {
       do_stuff();
       int nap = srand(5);
       /* Load balancing, prevent simultaneous registration: */
       sleep(nap);
       callback();
       sleep(5-nap);
    }
    
    Т.е. цикл с libFoo_registerStuff(bar[i]) переносился в этот колбек. Такие дела.

    CHayT, 03 Июля 2016

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

    +1

    1. 1
    2. 2
    3. 3
    Вот одного не могу понять
    Почему некоторые люди пишут на С, принципиально не на С++?
    Ведь в С++ можно писать на C, и когда нужно юзать фичи и стдлибу ++.

    guestinho, 03 Июля 2016

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

    −6

    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
    /* skip directories */
    	if (S_ISDIR(statbuf.st_mode))
    		goto out;
    
    	/* skip non-readable files */
    	if ((statbuf.st_mode & S_IRUSR) == 0)
    		goto out;
    
    	/* read attribute value */
    	fd = open(path, O_RDONLY);
    	if (fd < 0) {
    		dbg(udev_device->udev, "attribute '%s' can not be opened\n", path);
    		goto out;
    	}
    	size = read(fd, value, sizeof(value));
    	close(fd);
    	if (size < 0)
    		goto out;
    	if (size == sizeof(value))
    		goto out;
    
    	/* got a valid value, store it in cache and return it */
    	value[size] = '\0';
    	util_remove_trailing_chars(value, '\n');
    	dbg(udev_device->udev, "'%s' has attribute value '%s'\n", path, value);
    	list_entry = udev_list_entry_add(udev_device->udev, &udev_device->sysattr_list, sysattr, value, 0, 0);
    	val = udev_list_entry_get_value(list_entry);
    out:
    	return val;

    Кусок libudev, OpenSource теперь с goto

    semoro, 02 Июля 2016

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

    +4

    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)
  9. Си / Говнокод #20289

    +3

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

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

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

    j123123, 28 Июня 2016

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

    +3

    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
    * if you know a switch stmt will not exceed the lowest or highest case values.  
    switch [] is a little faster because it doesn't check.
    
    * switch stmts always use a jump table.  Don't use them with cases with really 
    big, sparse ranges.
    
    * Allows ranges like "case 4...7:" in switch stmts.
    
    * A no case number causes next higher int case in switch stmts.  See 
    ::/Demo/NullCase.CPP.
    
      I64 i;
      for (i=0;i<20;i++) 
        switch (i) {
          case: "Zero\n";   break; //Starts at zero
          case: "One\n";    break; //One plus prev case.
          case: "Two\n";    break;
          case: "Three\n";  break;
          case 10: "Ten\n"; break;
          case: "Eleven\n"; break; //One plus prev case.
      }
    
    * Switch statements can be nestled with a single switch expression!  This is 
    known as a "sub_switch" statement.  start/end are used to group cases.  Don't 
    goto out of, throw an exception out of, or return out of the start front porch 
    area.  See ::/Demo/SubSwitch.CPP.
    
      I64 i;
      for (i=0;i<10;i++)
        switch (i) {
          case 0: "Zero ";  break;
          case 2: "Two ";           break;
          case 4: "Four ";  break;
          start:
            "[";
            case 1: "One";  break;
            case 3: "Three";        break;
            case 5: "Five"; break;
          end:
            "] ";
            break;
        }
      OutPut:
      >Zero [One] Two [Three] Four [Five]

    http://www.templeos.org/Wb/Doc/HolyC.html
    j123123 форсит заморского Царя сделавшего Священный Си и TempleOS

    3.14159265, 27 Июня 2016

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