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

    −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
    static bool
    do_convert(iconv_t cd, const char * src, int src_len,
               char ** dst, int *dst_len)
      {
      char * ret;
    
      char *inbuf;
      char *outbuf;
      int alloc_size;
      int output_pos;
      size_t inbytesleft;
      size_t outbytesleft;
    
      if(src_len < 0)
        src_len = strlen(src);
    #if 0
      fprintf(stderr, "Converting:\n");
      bgav_hexdump(src, src_len, 16);
    #endif
      alloc_size = src_len + BYTES_INCREMENT;
    
      inbytesleft  = src_len;
    
      /* We reserve space here to add a final '\0' */
      outbytesleft = alloc_size-1;
    
      ret    = malloc(alloc_size);
    
      inbuf  = (char *)src;
      outbuf = ret;
    
      while(1)
        {
    
        if(iconv(cd, (ICONV_CONST char **)&inbuf, &inbytesleft,
                 &outbuf, &outbytesleft) == (size_t)-1)
          {
          switch(errno)
            {
            case E2BIG:
              output_pos = (int)(outbuf - ret);
    
              alloc_size   += BYTES_INCREMENT;
              outbytesleft += BYTES_INCREMENT;
    
              ret = realloc(ret, alloc_size);
              if (ret == NULL)
                {
                cdio_warn("Can't realloc(%d).", alloc_size);
                return false;
                }
              outbuf = ret + output_pos;
              break;
            default:
              cdio_warn("Iconv failed: %s", strerror(errno));
              if (ret != NULL)
                free(ret);
              return false;
              break;
            }
          }
        if(!inbytesleft)
          break;
        }
      /* Zero terminate */
      *outbuf = '\0';
    
      /* Set return values */
      *dst = ret;
      if(dst_len)
        *dst_len = (int)(outbuf - ret);
    #if 0
      fprintf(stderr, "Conversion done, src:\n");
      bgav_hexdump(src, src_len, 16);
      fprintf(stderr, "dst:\n");
      bgav_hexdump((uint8_t*)(ret), (int)(outbuf - ret), 16);
    #endif
      return true;
    }

    https://github.com/pbatard/rufus/blob/edcfd43ed550b17f23f9534f4b3b5cdd7fffdefc/src/libcdio/driver/utf8.c#L170-L248

    А вы тут видите тут баг?

    Запостил: j123123, 05 Июля 2017

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

    • Увидел у тебя промеж ягодиц.
      Ответить
    • Типичный понос на си.
      Ответить
    • > А вы тут видите тут баг?
      ret = realloc(ret, alloc_size)?

      Или что-то более серьёзное?
      Ответить
      • Да, оно. Есть еще всякая параша с этими realloc:
        https://github.com/radare/radare2/issues/7881
        у меня просто БАГОР от такого
        Ответить
        • Поэтому я за "PHP". Спокойно программируешь себе и не думаешь ни о чём, в том числе и о расходовании памяти. Наслаждение, а не ремесло. А вы ебитесь со своими прикладными языками.
          Ответить
        • Типичный понос на си. Не понимаю, зачем программировать на си, когда есть с++, где все эти проблемы успешно решены и ничего не течет.
          Ответить
          • Потому что плюсы это ебаный кусок говна, который тянет за собой нихуевый такой кусок рантайма?

            Вообще, на Си можно писать нормально, просто надо уметь

            Надо мне наверное написать какую-нибудь фундаментальную статью, типа "Почему плюсы и STL это днище ебаное и всем плюсоблядям надо ссать в еблет за ту хуйню, которую они придумали", но пока лень
            Ответить
            • За одно RAII уже можно перейти на тёмную сторону.
              Ответить
            • > плюсы это ебаный кусок говна
              Пустые слова без конкретики.

              > нихуевый такой кусок рантайма
              О каком рантайме речь? О том, что стандартная библиотека много места занимает (якобы)? В 2017 году мегабайты бинаря считать нет никакого смысла. В плюсах в рантайме кроме программы ничего не выполняется. Даже исключения не тратят цпу, пока их не кидаешь.

              > Си можно писать нормально, просто надо уметь
              Уметь не забывать расставлять free и pthread_mutex_unlock? Зачем, если в плюсах с этим справляется компилятор? Или уметь костылить хэштаблицы на макросах и войдзвездочках? Дженерики-то не завезли.

              > Надо мне наверное написать
              Очень интересно будет прочитать мнение кукаретика.
              Ответить
              • >О каком рантайме речь? О том, что стандартная библиотека много места занимает (якобы)? В 2017 году мегабайты бинаря считать нет никакого смысла. В плюсах в рантайме кроме программы ничего не выполняется. Даже исключения не тратят цпу, пока их не кидаешь.
                Скажи это моему 8-битному микроконтроллеру

                >Уметь не забывать расставлять free и pthread_mutex_unlock? Зачем, если в плюсах с этим справляется компилятор? Или уметь костылить хэштаблицы на макросах и войдзвездочках? Дженерики-то не завезли.
                Нет, уметь нормально архитектуру продумать, чтобы не было всякой жопы.

                >Очень интересно будет прочитать мнение кукаретика.
                Пройди-ка ты нахуй, крестопетух
                Ответить
                • > 8-битному микроконтроллеру
                  Я таким не увлекаюсь. Разрешаю си оставаться в этой нише, с которой я никогда не пересекусь.

                  > Нет, уметь нормально архитектуру продумать, чтобы не было всякой жопы.
                  Ну это можно и в плюсах. А еще компилятор память сам освободит и структуры данных готовые есть, которые работают с любыми типами. Смысл сишечки остается неясен.

                  > Пройди-ка ты нахуй, крестопетух
                  Нет, ты.
                  Ответить
                • а --static-libstdc++ не спасает?
                  Ответить
                  • Спасет только полный отказ от плюсовой стдлибы и написание на подмножестве плюсов. Да и вообще лучше ни C, ни C++ не использовать, а все сразу в асме херачить, ибо компиляторы говно http://govnokod.ru/19395
                    Ответить
                    • > написание на подмножестве плюсов
                      Ну это все так делают.
                      Ответить
                  • Самое смешное, что глибси - единственное, что нельзя линкануть статически в прыщах.
                    Ответить

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