1. C++ / Говнокод #23801

    −1

    1. 1
    2. 2
    3. 3
    4. 4
    // Read option name (can contain spaces)
         while (is >> token && token != "value")
    -        name += string(" ", name.empty() ? 0 : 1) + token;
    +        name += (name.empty() ? "" : " ") + token;

    terminate called after throwing an instance of 'std::length_error'
    what(): basic_string::_M_create


    Replacing string(" ", name.empty() ? 0 : 1) with (name.empty() ? "" : " ") and the same in the while() loop for value fixes the problem (for me).

    Does anyone know if "string(" ", 0)" is invalid C++ ?

    Кресты такие кресты.

    Запостил: 3.14159265, 18 Февраля 2018

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

    • дело не в самих крестах, видимо что-то с компилятором. Строки вообще не должны length_error кидать, а для string(const char *s, size_t size) надо лишь чтобы s был корректным указателем.
      Ответить
    • https://wandbox.org/permlink/1ARI14UWTuo4iZwM
      https://wandbox.org/permlink/RFCaCRDx0R1ruyGZ

      Скажите своему производителю libstdc++ что он мудак
      Ответить
      • #gcc, #O3, #windows-only
        Ответить
        • MinGW, говоришь? какая версия то хоть?
          Ответить
        • Компилятор как бы намекает, что нефиг было выёбываться с этим конструированием стринга... А дизасма случаем нету?
          Ответить
          • Винды под рукой нет. Взял отсюда:
            https://groups.google.com/forum/?fromgroups=#!topic/fishcooking/RjIPgeFFLPQ

            >Компилятор как бы намекает, что нефиг было выёбываться с этим конструированием стринга...
            Кстати да. У комилятора же задача: находить хуйню.
            Ответить
    • Ответить
    • В чем прикол? Перепутал одинарные кавычки с двойными?

      string(name.empty() ? 0 : 1, ' ')
      Ответить
      • Не, вот в первом комментарии к этому говнокоду упомянули этот конструктор: string(const char *s, size_t size). Всё верно.
        Видимо, реализация попыталась выделить 0 байт под строку и сломалась.
        Ответить
        • http://www.cplusplus.com/reference/new/operator%20new/
          - size
          If this argument is zero, the function still returns a distinct non-null pointer on success

          http://www.cplusplus.com/reference/cstdlib/malloc/
          If size is zero, the return value depends on the particular library implementation (it may or may not be a null pointer)
          Ответить
          • 3.7.3.1/2:
            32. The intent is to have operator new() implementable by calling malloc() or calloc(), so the rules are substantially the same. C++ differs from C in requiring a zero request to return a non-null pointer.


            Видимо, этот пункт некорректно сделали. Откуда length_error - всё равно хз
            Ответить
            • Всё равно твоей мамке, какой хер сосать - платят одинаково.
              Ответить
            • А, там же не bad_alloc... Видимо, просто проверку неправильно сделали: if (size <= 0) throw length_error(...)
              Ответить
              • парень в сексуальном кружавчике обслужит парня или группу парней предпочтение кавказцам все позы секс-практики и секс-игрушки, любые желания за твои деньги! пиши прямо сейчас wiistriker@gmail.com антон ЖДУ
                Ответить
        • Как GetOverlappedResult

          На мсдн нет инфы, что "0" это весь буфер, а не "пусто", в пайпах, долго искали...
          Ответить
          • кому нахй нужны оверлаппдрезул если есть completion ports?
            Ответить

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