Common Intermediate Language и системное программирование в Microsoft.Net. Макаров А.В - 76 стр.

UptoLike

найти первый блок, покрывающий диапазон адресов, в который попадает
адрес нужной инструкции. Время выполнения этой операции зависит
только от длины массива описателей, а так как он чаще всего бывает дос-
таточно коротким, время поиска оказывается невелико.
Рис. 4.4. Дерево блоков в структуре графа потока управления
Совсем другая ситуация возникает в графе потока выполнения. Что-
бы определить, в какой блок входит некоторая инструкция графа (то есть
узел графа), мы должны каким-то образом пройти от этой инструкции по
дугам графа в обратном направлении до входа в блок. Время выполнения
этой операции зависит от количества инструкций в блоке и значительно
превышает время поиска блока в случае линейной последовательности
инструкций.
Анализ кода на CIL
139
catch System.OverflowException {
pop
ldc.i4.0
stloc.0
leave.s exit
}
exit: ldloc.0
ret
}
Граф потока управления для метода checkedAdd показан на рис. 4.3.
Рис. 4.3. Граф потока управления для метода checkedAdd
4.1.3. Дерево блоков в графе потока управления
Когда выполнение некоторой инструкции в линейной последова-
тельности инструкций порождает исключение, всегда можно легко опре-
делить защищенный блок, которому эта инструкция принадлежит. Для
этого требуется всего лишь просканировать массив описателей блоков и
138
CIL и системное программирование в Microsoft .NET
Метод
checkedAdd
Защищенный
блок
ldarg.0
Catch-блок
pop
ldloc.0
ret
ldc.i4.0 stloc.0 leave.s
ldarg.1 add.ovf stloc.0 leave.s
Блок тела метода
Защищенный блок
Защищенный блок
Защищенный блок
Инструкции
Инструкции
ИнструкцииИнструкции
Инструкции Инструкции
Блоки обработки
исключений
Блоки обработки
исключений
Блоки обработки
исключений
138                             CIL и системное программирование в Microsoft .NET   Анализ кода на CIL                                                      139


            catch System.OverflowException {                                        найти первый блок, покрывающий диапазон адресов, в который попадает
            pop                                                                     адрес нужной инструкции. Время выполнения этой операции зависит
            ldc.i4.0                                                                только от длины массива описателей, а так как он чаще всего бывает дос-
            stloc.0                                                                 таточно коротким, время поиска оказывается невелико.
            leave.s exit
            }                                                                                                       Блок тела метода
      exit: ldloc.0
            ret
      }                                                                                Защищенный блок                     Защищенный блок

      Граф потока управления для метода checkedAdd показан на рис. 4.3.
                                                                                                         Блоки обработки                  Блоки обработки
    Метод
                                                                                                           исключений                       исключений
  checkedAdd


 Защищенный
    блок                                                                               Инструкции                Инструкции                    Инструкции


            ldarg.0       ldarg.1        add.ovf       stloc.0        leave.s
                                                                                                                                               Инструкции

             Catch-блок

                                                                                                         Защищенный блок           Блоки обработки
                  pop         ldc.i4.0       stloc.0        leave.s                                                                  исключений


  ldloc.0
                                                                                                     Инструкции                          Инструкции

      ret
                                                                                         Рис. 4.4. Дерево блоков в структуре графа потока управления
      Рис. 4.3. Граф потока управления для метода checkedAdd
                                                                                         Совсем другая ситуация возникает в графе потока выполнения. Что-
4.1.3. Дерево блоков в графе потока управления                                      бы определить, в какой блок входит некоторая инструкция графа (то есть
                                                                                    узел графа), мы должны каким-то образом пройти от этой инструкции по
     Когда выполнение некоторой инструкции в линейной последова-                    дугам графа в обратном направлении до входа в блок. Время выполнения
тельности инструкций порождает исключение, всегда можно легко опре-                 этой операции зависит от количества инструкций в блоке и значительно
делить защищенный блок, которому эта инструкция принадлежит. Для                    превышает время поиска блока в случае линейной последовательности
этого требуется всего лишь просканировать массив описателей блоков и                инструкций.