1. Pascal / Говнокод #21260

    −54

    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
    fstream:=tstreamex.Create(signaturepath,fmShareDenyWrite);
        FLock.Enter;
        try
          while not fstream.EOS do
          begin
            obj:=tsignature.create;
            try
              obj.AddingDate:=fstream.ReadDate;
              obj.Comment:=fstream.ReadString;
              fstream.ReadBuffer(Len, SizeOf(Len));
              obj.MStream.SetSize(len);
              fstream.ReadBuffer(obj.mstream.memory^, len);
              fsignlist.Add(obj);
            except
              obj.Free;
              raise esignatureloadingerror.Create('Signature read error');
            end;

    Стрим читает из файла сохраненный объект. К сожалению, подобный подход используется даже в серьезных коммерческих проеках, это классика.
    Если что-то поменять в файле хоть на 1 байт, стрим промахнётся мимо поля - прога либо съест всю доступную системную память либо обрушится с Access Violation.
    В любом случае, память будет испорчена, и дальнейшее выполнение программы чревато UB.

    Кстати, а не грозит ли юзание структур порчей памяти? Допустим, хотим определить валидность заголовка, загружаем структуру, а в файле - трешак.
    Не будет ли обращения по ложному адресу? UB?

    Запостил: voodoodal16, 24 Сентября 2016

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

    • показать все, что скрытоv nase vreme esco kto-to piset na paskal? kakoi bagor(((((
      Ответить
    • показать все, что скрытоЛолблядь, не сериализируй объекты, если сериализатор такое говно. Юзай json, например.
      Ответить
    • показать все, что скрытоАхуительно крутые спецы собрались на моём топике... Пиздец.
      Вы словно голуби: только "курлы-мурлы", а пользы - 0. Только белье на веревке пачкаете.
      Ответить
    • показать все, что скрытоЯ нихуя не понял, но в нормальных языках копировать содержимое файла/сокета в плоскую структуру (без указателей) - это безопасно, хоть и непортируемый говнокод.
      Ответить
    • показать все, что скрыто> Кстати, а не грозит ли юзание структур порчей памяти? Допустим, хотим определить валидность заголовка, загружаем структуру, а в файле - трешак.
      Не будет ли обращения по ложному адресу? UB?

      Э, да ты совсем нуб что ли. Если размер файла меньше размера структуры то прочитать не удастся, будет исключение. А если больше - все поля прочитаются. Ну да, в полях может быть мусор, на то он и заголовок что надо будет сигнатуры сравнить, но откуда там ложные адреса и UB?
      Ответить
      • показать все, что скрыто>> Если размер файла меньше размера структуры то прочитать не удастся, будет исключение. А если больше - все поля прочитаются. Ну да, в полях может быть мусор

        Если вылетело исключение - разве сие не знак того, что испорчена память? Вдруг код затёр служебные заголовки? Мусор в полях - тоже UB, как мне кажется.
        Ответить
        • показать все, что скрыто> Мусор в полях - тоже UB, как мне кажется.
          Ну тогда при объявлении любой локальной переменной происходит UB. Это уже потом мы присваиваем ей значение, а до этой строчки с присвоением - полнейшее UB.
          Ответить
          • показать все, что скрыто> а до этой строчки с присвоением - полнейшее UB
            Поэтому и советуют инициализировать переменную сразу в объявлении.
            Ответить
            • показать все, что скрытоимеет-ли право компилятор иметь в такой переменной адрес доступного на запись firmware? или MMIO какого-то оборудовання?

              Ну типа
              char *foo;
              *(foo) = 1; //превратились в кирпич или сожгли оборудование
              Ответить
              • показать все, что скрытоВай нот? Там же любой мусор, который был на стеке/в регистре может валяться.

                Ну MMIO тебе ось в адресное пространство не замапает просто так. А вот если без оси...
                Ответить
                • показать все, что скрыто>>тебе ось в адресное пространство не замапает просто так.
                  Кстати!! Расскажи мне как работает MMIO и DMA при наличии MMU?
                  Драйвер как-то умно читает таблицы странц и вычисляет настоящий адрес?
                  Ответить
                  • показать все, что скрыто> Драйвер как-то умно читает таблицы странц
                    Да там у ядер специальные апишки для трансляции адресов есть, чтобы драйверы не заморачивались. Типа "выдели мне непрерывный кусок физической памяти чтобы до него могла дотянуться вот эта железка и дай адрес, который можно ей скормить" или "замапай мне mmio адреса вот этой железки". И дальше там ядро настраивает все кеши, смещения на мостах, IOMMU если есть и т.п.
                    Ответить
                    • показать все, что скрытоЭто про DMA, как я понял?
                      Типа драйвер просит у ядра буфер, и скармиливает его адрес DMAшке на борту карты, и карта туда пишет-пишет и потом делает interrupt?

                      а MMIO как?

                      Ну вот сидит карта на шине и слушает адреса с FOO по BAR.
                      Если я сделаю mov [FOO], 42 то FOO через MMU преврарится в черте-чо. Как же драйвер умеет записать ИМЕННО в FOO?
                      Ответить
                      • показать все, что скрыто>>"замапай мне mmio адреса вот этой железки"
                        вот я в глаза долблюсь

                        теперь понятно
                        типа я говорю едру "пиши по адресу 0x1234", а оно само через таблицы высчитывает реальный адрес

                        да?
                        Ответить
                        • показать все, что скрытоТы говоришь ядру "замапай куда-нибудь mmio range вот этой вот железки". Оно тебе даёт виртуальный адрес (назовём его mapped). А таблицу трансляции для MMU для этого адреса оно тебе так настроит, что когда ты полезешь по адресу mapped + 8, то адрес уйдёт на шину правильно и, с учётом всех мостов в сторону железки, которые могут его немного подвинуть, прилетит к ней как 8 (или как base + 8, не знаю точно, где последняя трансляция идёт - в самой железке или в ближайшем к ней мосту)...
                          Ответить
                          • показать все, что скрытоа можно из юзерспейса так сказать?
                            Ответить
                            • показать все, что скрытоНет. Если у тебя нет знакомого драйвера.
                              Ответить
                              • показать все, что скрытопонятно.

                                иными словами процессор ВСЕГДА обращение к памяти прогоняет через MMU, но ядро настраивает таблицы так, что MMU мапит такие обращения не абы-куда а в нужное место.

                                ужасная жесть этот ваш протектед мод
                                то-ли дело дос:
                                char* VGA;
                                VGA = АДРЕС_КУДА_МАПИЦА_ПАМЯТЬ_ВИДЯХИ;
                                VGA[1] = YELLOW;
                                Ответить
                                • показать все, что скрыто> процессор ВСЕГДА обращение к памяти прогоняет через MMU <...>
                                  Так точно.

                                  > ужасная жесть этот ваш протектед мод
                                  Запили свою 64-битную ось с маппингом 1:1 :)
                                  Ответить
                                  • показать все, что скрытоне смогу. Бог с ним с MMIO, обычную память-то операционка все равно должна раскидывать.
                                    Программ-то больше чем одна)
                                    Ответить
                                    • показать все, что скрыто> Программ-то больше чем одна
                                      Ну сделай почти-однозадачную, как DOS.

                                      З.Ы. Первые iOS'ы вроде тоже как китайские телефоны были - в фоне только плейер да будильник. И ничё, пипл хавал...
                                      Ответить
                                      • показать все, что скрыто"почти" -- это ты о TSRах на прерываниях?

                                        Вполне себе многозадачненько! Причем если запрограммировать таймеры (там же их было два вроде) то чем не многозадачность?;)
                                        Причем не было гонок, не нужно было делать fence потому что DOS не умел более одного CPU (да?).

                                        у iOS это связано с желанием не тратить батарейку на всяких пидарасов. Технически Darwin @ XNU вполне себе многозадачна, как ты понимаешь:)

                                        Кстати говоря даже сейчас чтобы что-то делать в офне нужно это явно попросить (через plist) и список дел крайне ограничен) Тебя либо "иногда будут будить", либо разрешат быть всегда в фоне если ты плеер или навигатор.

                                        Ну то-есть нельзя невозбранно простые числа искать за счет пользователя в фоне. А в ондроиде можно)
                                        Ответить
                                        • показать все, что скрыто> А в ондроиде можно
                                          Если есть право на wake lock. Иначе телефон всё-таки забьёт и уснёт.
                                          Ответить
                                          • показать все, что скрытоуснет, да

                                            но сервис-то можно сделать
                                            Ответить
                                            • показать все, что скрыто> сервис-то можно сделать
                                              Один хуй засыпает... Без wake lock у меня не получалось нормально дёргать странички с ГК. Сервис просыпался только с какими-нибудь гугловскими прогами или когда экран включал... Алармы тоже не особо помогают без лока, чуть управление вернёшь - сразу в сон.
                                              Ответить
                                              • показать все, что скрытону а в ябле когда тебя отправили в бекграунд у тебя есть 20 секунд чтобы сдохнуть

                                                ты можешь поклянчить еще, но не факт что дадут

                                                Так что даже если телефон не спит, то тебя могут выкинуть нахуй (если памяти мало) и фиг ты чего сделаешь
                                                Ответить
                                                • показать все, что скрыто> могут выкинуть нахуй
                                                  Ну это и на андроиде так. Не дрючить же флешку свопом.
                                                  Ответить
                                                  • показать все, что скрытои всё же в андроиде есть такое понятие:
                                                    https://developer.android.com/guide/components/services.html

                                                    А в ios у тебя такого понятия нет. Ты можешь только попросить будить тебя _иногда_.
                                                    Ну либо ты особенный (например, плеер)

                                                    https://developer.apple.com/library/content/documentation/iPhone/Conceptual/iPhoneOSProgrammingGuide/BackgroundExecution/BackgroundExecution.html
                                                    Ответить
    • показать все, что скрытоUse checksums, Luke.
      Ответить

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