1. Куча / Говнокод #18453

    +142

    1. 1
    http://habrahabr.ru/post/72959/

    Сразу прошу извинить...

    1. за хабр ;(
    1. за баянизм - ссылка на этот пост уже была на гк.

    Знаю по опыту, что объекты в делфи инициализируются мусором.
    "В Delphi это не представляет никаких трудностей, так как любой объект еще до передачи управления конструктору инициализируется нулями." - выебать бы маму автора сего пёрла.

    Запостил: Stertor, 09 Июля 2015

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

    • показать все, что скрыто
      procedure TForm1.FormCreate(Sender: TObject);
      var
        strlist:tstringlist;
      begin
        //явный каст переменной в указатель->беззнаковое число->строку
        showmessage(inttostr(cardinal(pointer(strlist)))) // <> 0
        // явно "занилим" указатель
        strlist:=nil;
        showmessage(inttostr(cardinal(pointer(strlist)))) //  0
      end;
      Ответить
      • показать все, что скрытоГде здесь конструктор, и вообще объект? Я вижу непроинициализированную локальную переменную. В статье речь вообще-то шла о вот таком:
        type
          TTest = class
          public
            FList: TStringList;
            constructor Create;
          end;
        
        constructor TTest.Create;
        begin
          ShowMessage(Format('%d', [Integer(FList)])); // 0
          inherited Create;
        end;
        
        procedure TForm1.Button1Click(Sender: TObject);
        begin
          TTest.Create.Free;
        end;
        Ответить
    • показать все, что скрыто3. За то что Стертор
      Ответить
    • показать все, что скрыто>>Знаю по опыту, что объекты в делфи инициализируются мусором.

      Нет, они тупо не инициализируются.
      Ответить
      • показать все, что скрытоА в чём разница? Инициализация - какое-то действие, которое требуется провести, чтобы переменная была инициализирована?

        А что в брейнфаке? Там переменные на ленте уже инициализированы или ещё нет, просто имеют значение "0"?
        Ответить
        • показать все, что скрытоЕсли бы в делфи объекты инициализировались мусором, то после создания объекта создавался бы рандомный мусор, а потом записывался в поля, что более трудоемко, чем забить нолями. Весь выигрыш в том, что инициализации автоматической в делфи нет.

          В брейнфаке память в начале исполнения зануляется - инициализируется нолями.
          Ответить
          • показать все, что скрыто> Если бы
            Можно рассматривать текущее поведение как оптимизацию вышеопианной трудоёмкой операции.

            Скажем, если у нас есть некоторый язык, который предполагает инициализацию нулями, в такой вот функции
            void func() {
              var x = 5;
              while(x > 0) print(x--);
              var y;
              print(y);
            }

            Можно было бы сказать, что y вообще не инициализируется, поскольку оптимизатор этого чудо-языка понял бы, что x больше не нужен и равен нулю и объединил x и y в одно место в памяти.
            Ответить
            • показать все, что скрытос чего ты взял, что оптимизатор это сделает? Зависит от реализации
              Ответить
              • показать все, что скрытоЭто мой выдуманный язык, что я скажу, то и сделает оптимизатор.
                В общем случае можно только уверовать в некоторое действие (например, в инициализацию) и только по побочным эффектам судить о том, что творится внутри.
                Ответить
                • показать все, что скрытоа спецификации нахуя?

                  Уверовать? Ну если человеку пох, то да, можно и уверовать.
                  Ответить
                  • показать все, что скрытоСпецификации? Смотря, какой язык. В сишках может и есть не только UB, Но и гарантии, но в более высокоуровневом случае лучше уверовать.

                    > если человеку пох
                    А кому не пох? Кому? Кто-то будет запускать виртуалку и смотреть за каждой операцией, чтобы понять, что произошло в заэваленном куске кода на каком-нибудь JS, зная, что, стоит добавить туда ещё пару строк, как ситуация изменится?
                    Ответить
        • Ой, да джсблядь спросить забыли
          Ответить
    • показать все, что скрытоЗанятно. Я подрочил.
      Ответить
    • В переменных мусор изначально, если они стековые. Какая-либо специальная инициализация не производится, если эти переменные - не поля класса. Обращение к неинициализированным типам, вроде Int безопасно (результат будет в пределах от -MaxInt до MaxInt), чего нельзя сказать о строковых типах и массивах - будет заведомый вылет.
      Ответить
    • Задумывались ли Вы когдан-нибудь, к какому царству принадлежат все на свете микробы - бактерии и вирусы, к животным или растениям?..

      Хей, хелло, ай ам веджетабле,
      Май майнд из деструктабле-йоу,
      Анд май асс из дон'т ~вульнерабле~
      Бекаузе ай хэв'энт асс.
      Ответить
    • Бох мой. И этот ламер спамит говнокод?..
      Ответить
      • Этот ламер усердно трудится в одной из государственных шараг. Спам - это хоббит.
        Ответить

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