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

    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
    // этот код дает Segment Fault
    
    struct TypeNames
    {
        std::string typeName;
    };
    
    class LLVMRTTIHelperVCLinux
    {
        SmallVector<TypeNames> types;
    }
    
    // a этот нет
    
    class LLVMRTTIHelperVCLinux
    {
        SmallVector<std::string> types;
    }

    ну и гавно этот ваш Clang. MSVC работает, GCС работает а Clang нет

    Запостил: ASD_77, 29 Сентября 2021

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

    • высказываемся господа...
      Ответить
    • Clang хуйня, я его ненавижу. Он такой хуёвый, потому что на LLVM или потому что яблблядочный?
      Ответить
      • хер знает почему.. наверно думает что очень умный.
        Ответить
    • у меня подозрение что деструктор в "struct" убивает обьект string ... но на каком основании... нее... я лучше с GC буду чем с этим гов-ом
      Ответить
      • В «Nim» можно с «GC».
        Ответить
      • > у меня подозрение что деструктор в "struct" убивает обьект string

        А что, не должен? ;)
        Ответить
        • нет не должен . т.е. move коструктор никто не отменял :)
          Ответить
          • А с чего ты взял, что move отменяет вызов деструктора? Никаких магических флажочков там нету. Просто деструктору после мува обычно делать нечего кроме какой-нибудь проверки на nullptr.
            Ответить
            • просто при муве обьект должен отдать свои внутрение буфера и деструктор уже должен убить мертвый инстанс класса .. но нет ... походу он его грохает так качественно что и мув не успевает передать буфера
              Ответить
              • Ну тогда в дебаггере пробегись или логов добавь... Вангую, что косяк где-то в реализации SmallVector, просто с голой стрингой оптимизация по-другому легла.
                Ответить
              • У меня в Си никаких "мувов объектов" нет, поэтому я за Си.
                Ответить
                • Концептуально они в «Си» были с момента его создания.
                  И так же напарывались на проблемы с ними.
                  Ответить
                  • > Концептуально они в «Си» были с момента его создания.

                    В смысле? В "Си" нет концепции "объект" как в "C++", и нет естественно никаких "деструкторов" и "move-семантики".
                    Ответить
                    • Есть у тебя буфер, который ты заполнил. Вот тебе концептуально "объект", "область памяти", "неведомая ёбаная хуйня", называй, как хочешь. Вот ты передал его в другую фунцию/тред/ещё куда, но важно то, что удалять его, передавать дальше, вертеть на хую его будет эта функция, и тебе следует о нём забыть. Вот тебе концептуально "мув"/"передача владения"/"сепуление", называй, как хочешь. И тут ты забываешь выкинуть указатель на этот буфер и в конце, когда чистишь вилкой ресурсы (вот тебе концептуально "деструктор"), удаляешь его вместе с остальными своими буферами. Вот так напарываются на проблемы с "мувами" в Си.

                      От того, что на уровне языка поддержки какой-то хуйни нет, это не означает, что и базовая концепция этой хуйни неприменима. Блядь, да большинство си-подобных языков сделаны по принципу "а давайте запилим синтаксический сахарок чтобы Х делать автоматически/одной строкой"
                      Ответить
                      • > Вот тебе концептуально "мув"/"передача владения"/"сепуление", называй, как хочешь.

                        Не, ну если так рассуждать, то это "владение" и в ассемблере есть. Там же тоже можно что-то как-то выделить через какую-то "функцию" и потом куда-то там передавать и как-то освобождать
                        Ответить
    • Что такое SmallVector?
      Ответить
      • Маленький вектор.
        Ответить
        • Напомнило одну учётку:
          https://govnokod.ru/user/1503

          Он прилетал в каждую ветку обсуждения, чтобы написать очевидную вещь.
          Ответить
      • Попытался погуглить. Оказалось, что шаблон с таким названием есть в нескольких библиотеках.
        Ответить
    • Реализацию SmallVector в студию!
      Ответить
      • Поддерживаю, у меня повторить не получилось, а проводить расследование, какой именно SmallVector из какой версии какой библиотеки, мне никуда не впёрлось.
        Ответить
        • https://github.com/llvm/llvm-project/blob/main/llvm/lib/Support/SmallVector.cpp
          Ответить
          • и вот так я вызывал код

            mlir::Value throwInfoPtrValue(mlir::Location loc)
                {
                    //auto typeName = types.front().typeName; // было
                    auto typeName = types.front(); // стало
                     
                   return ... // <!-- вот тут происходил Segment Fault
                }
            Ответить
            • front() возвращает reference. Ты случаем ссылку на кусок мёртвого объекта не вернул из функции?

              З.Ы. Ну и в сам массив ничего не вставлял на протяжении этой функции?

              З.З.Ы. Разница между выведенным типом typeName в 3 и 4 строчке как бы намекает на что-то из этих вариантов. Именно поэтому я против auto.
              Ответить
              • А не, сорри, я гоню, авто всё-таки срезает ссылку, и там и там будет копия строки.

                Покажи тогда что дальше происходит с typeName.
                Ответить
                • Есть auto, а есть auto &. Попрошу не путать, а то могут и напутать.
                  Ответить
                  • Да пиздец, мне на пенсию помойку пора, уже кресты забываю.
                    Ответить
                    • А я вот не могу их забыть... потому что я их не знаю.

                      Недавно пытался что-то написать на крестах и как раз вляпался в auto и auto &.
                      Ответить
          • вот хеадер https://github.com/llvm/llvm-project/blob/main/llvm/include/llvm/ADT/SmallVector.h
            Ответить

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