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

    +20

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    #include <iostream>
    #include <string>
    
    int main(void)
    {
            char arr[] = "All's well that ends well";
            std::string s(arr, 3000);
            std::cout << s << std::endl;
    return(0);
    }

    Первое что пришло на ум, когда смотрел конструкторы string.
    Собирал: g++-4.5 -Wall -Wextra -pedantic-errors
    ideone.com и liveworkspace.org фильтруют.

    Запостил: sayidandrtfm, 17 Августа 2012

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

    • Ну std::string вполне может хранить нолики, что не так? Она с NULL terminated строками работает только в конструкторе да в c_str().
      Ответить
      • Скомпилировали и выполнили?
        Ответить
        • Ну, выдало ровно 3000+1 байт. Что-то не так?
          Ответить
          • Можно взглянуть на ваш выхлоп?
            Ответить
            • Например так: http://pastebin.com/kQJktGUU
              Ответить
              • Ну примерно такой же мусор и вывален. Разве что вместо x86_64 там написано i686.

                Начинается с "All's well that ends well", затем следует нолик, и затем мусор до 3000байт и 0x0A, который в endl.

                Ничего некорректного не вижу.
                Ответить
                • Запустив несколько раз, можно увидеть не только мусор, интересные пути...
                  http://pastebin.com/6UFmUdFs
                  В итого: конструктор не проверяющий соответствие длины массива на 'не более чем'.
                  Вот интересно, http://govnokod.ru/11604#comment151222 этот небось проверяет?
                  Ответить
                  • > В итого: конструктор не проверяющий соответствие длины массива на 'не более чем'.
                    Ну у него сигнатура как бы string(const char * s, size_t n), потому и нет никакой возможности проверить.

                    ЕМНИП шаблонные конструкторы запилить нельзя, поэтому подобную проверку никак не реализовать.
                    Ответить
                    • в смысле запилить нельзя?
                      ты про это?
                      http://ideone.com/4BHxK
                      Ответить
                      • Хм. Да, именно такой. Значит память мне изменила...
                        Ответить
                        • да всё равно он бессмысленнен
                          большинство строковых констант и так заканчиваются нулем, а те, что не заканчиваются - пользователю самому виднее, сколько конкретно взять из массива (как было виднее ОП)
                          Ответить
                          • Ну вообще да. И от неконстант (типа new char[100500]) все равно не спасет. Остается полагаться на благоразумие пользователя.
                            Ответить
                  • Анекдот в тему:

                    На наш завод привезли японский деревообрабатывающий станок. Приходит рабочий, берёт брусок вставляет его в станок, вжик, из станка выходит готовое изделие.
                    -Нихрена себе (сказал рабочий)
                    -А хули ты думал (сказал станок)
                    Берёт бревнышко потолще, вжиик, опять выходит изделие.
                    - Ну нихрена себе (сказал рабочий)
                    -А хули ты думал (сказал станок)
                    Берёт рельсу, крык....
                    -Ну нихрена себе (сказал станок)
                    -А хули ты думал (сказал рабочий)
                    Ответить
                    • А там продолжение к этому анекдоту есть? Где начальство на ковре вставляет рабочему бревнышко, и оный произносит первую фразу, а начальство вторую.
                      Ответить
                  • В любом случае, то, что выводится можно узнать через envp.
                    Ответить
            • >Можно взглянуть на ваш выхлоп?
              Можно, только нужно заставить борманда сдать анализы.
              Ответить
              • На пастбине круглосуточно.
                На голодный желудок и майонезную баночку не возвращают.
                Ответить
    • char arr[] = "All's well that ends well";
      std::string s(arr);
      std::cout << s << std::endl;
      Ответить
    • char arr[] = "All's well that ends well";
      std::string s(arr, 25);
      std::cout << s << std::endl;
      Ответить
    • http://ideone.com/3Yl06
      http://ideone.com/a6fC0
      Ответить
      • >ideone.com и liveworkspace.org фильтруют.
        Не нечитал.
        Ответить
        • Ты меня так затроллел, что я аж по ссылкам пошел искать тот текст, что ты процитировал.
          Ответить
      • Зелёные тролессылки? Это что-то новенькое...
        Ответить
    • Первое что пришло на ум

      Вам дают заряженный пистолет. У вас есть нога. Что же вам первое придет на ум?
      Ответить
      • > Что же вам первое придет на ум?
        Лол, а голова мне на что?
        Ответить
        • root@root:/usr/music/lyrics/aquarium/concerts/1980 - Аквариум и Майк# cat "15. Кто ты такой.lyr"
          ...
          Но в стену бить головой --
          Занятье не хуже других.
          А иначе, зачем мне дана
          Моя голова?
          ...

          root@root:/usr/music/lyrics/aquarium/concerts/1980 - Аквариум и Майк#
          Ответить
        • В нее стрелять?
          Ответить
      • > Что же вам первое придет на ум?

        У меня 2 ноги, слава Богу.
        Пистолет, тем более заряженный, в свои руки, по собственной воле не возьму, кто его знает
        что на нём висит.
        Ответить
        • Наверное, очень скучно так жить, когда всё очевидно.
          Ответить
      • Изменю условие:
        Вам дают заряженный пистолет. У вас есть чужая нога. Что же вам первое придет на ум?
        Ответить
      • Учись видеть позитив:
        http://img.filmsactu.net/datas/films/p/l/planete-terreur/xl/4ba0a0b444b28.jpg
        Ответить
    • Все, что хорошо кончается - колодец.
      Ответить

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