На главную
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! Правила раздела:
1. Название темы - краткое описание кто/что против кого/чего
2. В первом сообщении - список параметров, по которым идет сравнение.
3. Старайтесь аргументировать свои высказывания. Фразы типа "Венда/Слюникс - ацтой" считаются флудом.
4. Давайте жить дружно и не доводить обсуждение до маразма и личных оскорблений.
Модераторы: Модераторы, Комодераторы
Страницы: (7) « Первая ... 5 6 [7]  все  ( Перейти к последнему сообщению )  
> Чистота кода VS оптимизация
    Цитата Qraizer @
    чем напрочь запрещаем ASLR.
    Чтобы ASLR работал, нужно либо включить соответствующие опции в PE-заголовке (при компиляции, например). Либо прописать эти опции в реестре для конкретного файла.
    Но в целом ты прав, конечно.

    Добавлено
    Не углублялся в эту тему раньше.
    Ну тогда вместо отключения фиксапов можно включать ASLR и DEP (ну или просто DEP хотя бы):
    ExpandedWrap disabled
      {$APPTYPE CONSOLE}
      uses Windows, SysUtils;
      const
        IMAGE_DLLCHARACTERISTICS_DYNAMIC_BASE = $40;  // ASLR, {$DYNAMICBASE ON} in Delphi 2007+
        IMAGE_DLLCHARACTERISTICS_NX_COMPAT = $100;    // DEP
      {$SetPEOptFlags IMAGE_DLLCHARACTERISTICS_DYNAMIC_BASE or IMAGE_DLLCHARACTERISTICS_NX_COMPAT} // {$SetPEOptFlags $140}, works on Delphi 6+ (and maybe earlier)
      // http://qaru.site/questions/663368/how-can-i-enable-depnx-and-aslr-on-a-delphi-2006-or-earlier-executable
      // https://habrahabr.ru/company/eset/blog/206244/
       
      const R: Byte = $C3;
      begin
        WriteLn(IntToHex(DWord(@IntToHex), 8));
        try
          TProcedure(@R);
          WriteLn('DEP is OFF :(');
        except
          WriteLn('DEP is ON :)');
        end;
      end.
    Сообщение отредактировано: Jin X -
    aeskeygenassist bndstx cmpxchg16b dpps endbr64 f2xm1 gf2p8affineinvqb haddps incsspq jrcxz kxnorw ldmxcsr mpsadbw nop orpd pclmulhqlqdq qword rdpmc sha256rnds2 tzcnt unpcklpd vp4dpwssds wrfsbase xgetbv yword zword
      Без reloc-ов по-любому ASLR не заработает. Но тут как бы палка о двух концах. Во время отладки стрипать их даже полезно, ибо бряки, не привязанные к строкам кода, а поставленные, скажем, на конкретные ассемблерные инструкции, что нередко бывает нужно для либ без сыров, при активном ASLR слетают токатак. Но вот в релизе я удалять их всё-таки бы не советовал.
      Одни с годами умнеют, другие становятся старше.
        Цитата Qraizer @
        Без reloc-ов по-любому ASLR не заработает.
        Да это понятное дело.

        Цитата Qraizer @
        Во время отладки стрипать их даже полезно
        Можно так:
        ExpandedWrap disabled
          {$IFDEF DEBUG}
            {$SetPEFlags IMAGE_FILE_RELOCS_STRIPPED}
          {$ELSE}
            {$SetPEOptFlags IMAGE_DLLCHARACTERISTICS_DYNAMIC_BASE}
          {$ENDIF}
          {$SetPEOptFlags IMAGE_DLLCHARACTERISTICS_NX_COMPAT}
        :)
        aeskeygenassist bndstx cmpxchg16b dpps endbr64 f2xm1 gf2p8affineinvqb haddps incsspq jrcxz kxnorw ldmxcsr mpsadbw nop orpd pclmulhqlqdq qword rdpmc sha256rnds2 tzcnt unpcklpd vp4dpwssds wrfsbase xgetbv yword zword
          Кстати, кто подскажет, что это за прога (которая показывает заголовок PE в таком виде)?

          user posted image

          user posted image
          aeskeygenassist bndstx cmpxchg16b dpps endbr64 f2xm1 gf2p8affineinvqb haddps incsspq jrcxz kxnorw ldmxcsr mpsadbw nop orpd pclmulhqlqdq qword rdpmc sha256rnds2 tzcnt unpcklpd vp4dpwssds wrfsbase xgetbv yword zword
            Цитата Serafim @
            Крупные методы принято делить на более мелкие, в частности твой вариант, в языках с возвращаемым значением в операндах (JS, Python, Ruby), вместо кастуемых (Java, PHP) моет выглядеть следующим образом:



            А в нормальных следующим:

            ExpandedWrap disabled
              doSomethingClever :: Int -> String -> String
              doSomethingClever id name = show id ++ " => " ++ name
               
              tryToDoSomethingClever :: Maybe Int -> Result String
              tryToDoSomethingClever idParam = do
                  id   <- getId idParam
                  item <- getItem id
                  name <- getName item
                  return (doSomethingClever id name)


            Добавлено
            Цитата Jin X @
            Embarcadero чисто по загону новые версии выпускает. Для прикола, тупо порубить хоть чуть-чуть бабла на легаси-проектах

            Ага.
            Сообщение отредактировано: korvin -
            “Object-oriented design is the roman numerals of computing.” — Rob Pike
            All software sucks
              Цитата korvin @
              А в нормальных следующим:

              Оуоу, палехче)))

              P.S. А это разве не первый вариант? Возвращается же в конце концов функция (точнее композиция функций). Только указанная в качестве первого операнда, если, конечно не использовался оператор "$", тогда вернётся последующий аргумент.

              P.P.S. Хотя... Кажется это ещё один вариант:

              1) C, Java, PHP: "res = a || b"
              Результат: res = bool

              2) JS, Ruby, Python: "res = a || b"
              Результат: res = a (если он тру) или b

              3) Haskell: "res = a || b"
              Результат: функция "||" от a и b (я довольно плохо плохо знаю Haskell, так что поправь, если ошибаюсь)
              Сообщение отредактировано: Serafim -
              user posted image user posted image
                Цитата Serafim @
                Результат: функция "||" от a и b

                Что?

                ExpandedWrap disabled
                  {-
                   
                  tryToDoSomethingClever :: Maybe Int -> Result String
                  tryToDoSomethingClever idParam = do
                      id   <- getId idParam
                      item <- getItem id
                      name <- getName item
                      return (doSomethingClever id name)
                   
                  tryToDoSomethingClever :: Maybe Int -> Result String
                  tryToDoSomethingClever idParam =
                      getId idParam >>= (\id ->
                          getItem id >>= (\item ->
                              getName item >>= (\name ->
                                  return (doSomethingClever id name))))
                   
                  -}
                   
                  tryToDoSomethingClever :: Maybe Int -> Result String
                  tryToDoSomethingClever idParam =
                      case getId idParam of
                          Err msg -> Err msg
                          Ok  id  -> case getItem id of
                              Err msg  -> Err msg
                              Ok  item -> case getName item of
                                  Err msg  -> Err msg
                                  Ok  name -> Ok (doSomethingClever id name)


                https://ideone.com/f4Bzen
                Сообщение отредактировано: korvin -
                “Object-oriented design is the roman numerals of computing.” — Rob Pike
                All software sucks
                  Цитата Serafim @
                  1) C, Java, PHP: "res = a || b"
                  Результат: res = bool
                  Что значит bool? true если a, иначе true если b, иначе false. При проверке условия вместо возврата результата сразу производится переход к нужной ветке.
                  На самом деле вычисление результата тоже производится переходами.
                  То есть фактически в C res = a || b означает res = (a || b)? true: false

                  Цитата Serafim @
                  2) JS, Ruby, Python: "res = a || b"
                  Результат: res = a (если он тру) или b
                  В Python надо писать res = a or b. В остальном почти верно. При вычислении результата, сразу после определения значения выражения производится переход на точку сохранения результата.
                  Всё написанное выше это всего лишь моё мнение, возможно ошибочное.
                    Цитата amk @
                    Что значит bool?

                    Это означает, что там может находиться либо true, либо false и никак иначе.
                    user posted image user posted image
                      Цитата Serafim @
                      Это означает, что там может находиться либо true, либо false и никак иначе.
                      Но не указано, что если по `a` можно определить ответ, то `b` не анализируется
                      Всё написанное выше это всего лишь моё мнение, возможно ошибочное.
                        amk, я думаю, это не сложно определить эмпирически :)
                        aeskeygenassist bndstx cmpxchg16b dpps endbr64 f2xm1 gf2p8affineinvqb haddps incsspq jrcxz kxnorw ldmxcsr mpsadbw nop orpd pclmulhqlqdq qword rdpmc sha256rnds2 tzcnt unpcklpd vp4dpwssds wrfsbase xgetbv yword zword
                          Цитата amk @
                          Но не указано, что если по `a` можно определить ответ, то `b` не анализируется

                          Да ладно? :o Ты уверен? :huh:
                          user posted image user posted image
                            Уверен. В C это описано стандартом.
                            Так же и в C++, если переменные не являются пользовательскими типами.
                            Но в таком случае не может быть уверенности даже в результирующем значении. Пользовательский operator||() вовсе не обязан возвращать bool
                            Всё написанное выше это всего лишь моё мнение, возможно ошибочное.
                              Цитата Serafim @
                              Да ладно? Ты уверен?

                              Так практически везде же.
                              Подпись была включена в связи с окончанием срока наказания
                                Простите, я табличку сарказма потерял :D
                                user posted image user posted image
                                0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                                0 пользователей:


                                Рейтинг@Mail.ru
                                [ Script Execution time: 0,1400 ]   [ 16 queries used ]   [ Generated: 25.11.20, 00:19 GMT ]