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

UptoLike

Напомним, что предложения обработки исключений расположены в
массиве EH в определенном порядке, гарантирующем, что более вложен-
ный блок находится ближе к началу массива, чем объемлющий его блок.
Так как нам требуется строить дерево блоков в направлении от корня к ли-
стам, то есть от менее вложенных блоков к более вложенным, то мы будем
просматривать массив EH от конца до начала.
Итак, пусть переменная i пробегает значения от M-1 до 0 включитель-
но. Тогда для каждого i-го предложения мы будем выполнять следующее:
1. Поиск в массиве B блока, диапазон инструкций которого содер-
жит защищенную область i-го предложения.
Мы перебираем элементы массива B в обратном порядке, начи-
ная с последнего элемента, поэтому найденный блок будет са-
мым вложенным из блоков, диапазон инструкций которых со-
держит защищенную область i-го предложения.
2. Создание нового защищенного блока и добавление его в дерево.
Возможен случай, когда диапазон инструкций блока, найденно-
го в пункте 1, совпадает с защищенной областью i-го предложе-
ния. Если это так, то создание нового защищенного блока
не требуется. В противном случае мы создаем новый блок и до-
бавляем информацию о нем в массив B. При этом родителем для
созданного блока становится блок, найденный в пункте 1.
3. Создание блока обработки исключений.
На основе информации i-го предложения мы создаем новый
блок обработки исключений, добавляем его в массив B и связы-
ваем его с защищенным блоком. При этом родителем созданно-
го блока будет являться родительский блок защищенного блока.
4. Создание блока фильтрации.
Если мы имеем дело с блоком обработки исключений с пользо-
вательской фильтрацией, нам придется создать новый блок
фильтрации. При этом родителем для блока фильтрации являет-
ся блок обработки исключений.
На нашем псевдоязыке второй этап алгоритма можно записать следу-
ющим образом:
MBB = новый блок тела метода, в который записана информация о
методе:имя метода, сигнатура и данные о типах локальных
переменных;
B = новый массив размера 2*M+1 для хранения информации о блоках;
B[0].block = MBB; B[0].start = 0; B[0].length = N;
BN = 1;
for (int i = M-1; i >= 0; i--)
{
Анализ кода на CIL
143
Nodes[i] = новый узел, содержащий информацию об инструкции P[i];
}
Следует особо отметить, что для инструкций безусловного перехода
также создаются отдельные узлы. Инструкцию nop мы будем считать инст-
рукцией безусловного перехода по относительному адресу 0. Эти узлы для
инструкций безусловного перехода являются временными и на последнем
этапе алгоритма удаляются из графа.
4.2.2. Создание дерева блоков
На втором этапе работы алгоритма мы строим дерево блоков на осно-
ве информации, находящейся в массиве предложений обработки исклю-
чений.
На входе второго этапа мы имеем массив EH. На выходе получаем де-
рево блоков и вспомогательный массив B, связывающий блоки с инфор-
мацией о диапазонах входящих в них инструкций (другими словами, с ин-
формацией об областях кода). Каждый элемент массива B будет состоять
из трех полей:
Поле block.
Это поле содержит ссылку на блок.
Поле offset.
Содержит целое число, обозначающее индекс первой инструк-
ции блока в массиве P.
Поле length.
Содержит количество инструкций, входящих в блок (длина
блока).
Следует отметить, что размер массива B заранее неизвестен и зависит
от информации в массиве EH. Нетрудно догадаться, что минимальное ко-
личество блоков в массиве B равно M+2 (если мы имеем один защищенный
блок, M блоков обработки исключений и один блок тела метода). Анало-
гично, максимальное количество блоков вычисляется по формуле 2*M+1
(M защищенных блоков, M блоков обработки исключений и один блок тела
метода). Таким образом, необходимо либо сделать массив B динамиче-
ским, либо выделить для него 2*M+1 записей. В любом случае, пусть в даль-
нейшем BN обозначает текущее количество блоков, информация о которых
хранится в массиве B.
Сначала создадим блок тела метода (назовем его MBB). Он будет яв-
ляться корнем дерева, которое мы строим. К нему в дальнейшем будут
«прицеплены» все остальные узлы графа, и именно его наш алгоритм бу-
дет возвращать в результате своей работы. Для блока MBB в массив B добав-
ляется запись, поле start которой содержит значение 0, а поле length
значение N.
142
CIL и системное программирование в Microsoft .NET
142                         CIL и системное программирование в Microsoft .NET   Анализ кода на CIL                                                   143


       Nodes[i] = новый узел, содержащий информацию об инструкции P[i];              Напомним, что предложения обработки исключений расположены в
     }                                                                          массиве EH в определенном порядке, гарантирующем, что более вложен-
     Следует особо отметить, что для инструкций безусловного перехода           ный блок находится ближе к началу массива, чем объемлющий его блок.
также создаются отдельные узлы. Инструкцию nop мы будем считать инст-           Так как нам требуется строить дерево блоков в направлении от корня к ли-
рукцией безусловного перехода по относительному адресу 0. Эти узлы для          стам, то есть от менее вложенных блоков к более вложенным, то мы будем
инструкций безусловного перехода являются временными и на последнем             просматривать массив EH от конца до начала.
этапе алгоритма удаляются из графа.                                                  Итак, пусть переменная i пробегает значения от M-1 до 0 включитель-
                                                                                но. Тогда для каждого i-го предложения мы будем выполнять следующее:
4.2.2. Создание дерева блоков                                                           1. Поиск в массиве B блока, диапазон инструкций которого содер-
     На втором этапе работы алгоритма мы строим дерево блоков на осно-                     жит защищенную область i-го предложения.
ве информации, находящейся в массиве предложений обработки исклю-                          Мы перебираем элементы массива B в обратном порядке, начи-
чений.                                                                                     ная с последнего элемента, поэтому найденный блок будет са-
     На входе второго этапа мы имеем массив EH. На выходе получаем де-                     мым вложенным из блоков, диапазон инструкций которых со-
рево блоков и вспомогательный массив B, связывающий блоки с инфор-                         держит защищенную область i-го предложения.
мацией о диапазонах входящих в них инструкций (другими словами, с ин-                   2. Создание нового защищенного блока и добавление его в дерево.
формацией об областях кода). Каждый элемент массива B будет состоять                       Возможен случай, когда диапазон инструкций блока, найденно-
из трех полей:                                                                             го в пункте 1, совпадает с защищенной областью i-го предложе-
        • Поле block.                                                                      ния. Если это так, то создание нового защищенного блока
          Это поле содержит ссылку на блок.                                                не требуется. В противном случае мы создаем новый блок и до-
        • Поле offset.                                                                     бавляем информацию о нем в массив B. При этом родителем для
          Содержит целое число, обозначающее индекс первой инструк-                        созданного блока становится блок, найденный в пункте 1.
          ции блока в массиве P.                                                        3. Создание блока обработки исключений.
        • Поле length.                                                                     На основе информации i-го предложения мы создаем новый
          Содержит количество инструкций, входящих в блок (длина                           блок обработки исключений, добавляем его в массив B и связы-
          блока).                                                                          ваем его с защищенным блоком. При этом родителем созданно-
     Следует отметить, что размер массива B заранее неизвестен и зависит                   го блока будет являться родительский блок защищенного блока.
от информации в массиве EH. Нетрудно догадаться, что минимальное ко-                    4. Создание блока фильтрации.
личество блоков в массиве B равно M+2 (если мы имеем один защищенный                       Если мы имеем дело с блоком обработки исключений с пользо-
блок, M блоков обработки исключений и один блок тела метода). Анало-                       вательской фильтрацией, нам придется создать новый блок
гично, максимальное количество блоков вычисляется по формуле 2*M+1                         фильтрации. При этом родителем для блока фильтрации являет-
(M защищенных блоков, M блоков обработки исключений и один блок тела                       ся блок обработки исключений.
метода). Таким образом, необходимо либо сделать массив B динамиче-                   На нашем псевдоязыке второй этап алгоритма можно записать следу-
ским, либо выделить для него 2*M+1 записей. В любом случае, пусть в даль-       ющим образом:
нейшем BN обозначает текущее количество блоков, информация о которых                 MBB = новый блок тела метода, в который записана информация о
хранится в массиве B.                                                                       методе:имя метода, сигнатура и данные о типах локальных
     Сначала создадим блок тела метода (назовем его MBB). Он будет яв-                      переменных;
ляться корнем дерева, которое мы строим. К нему в дальнейшем будут
«прицеплены» все остальные узлы графа, и именно его наш алгоритм бу-                 B = новый массив размера 2*M+1 для хранения информации о блоках;
дет возвращать в результате своей работы. Для блока MBB в массив B добав-            B[0].block = MBB; B[0].start = 0; B[0].length = N;
ляется запись, поле start которой содержит значение 0, а поле length –               BN = 1;
значение N.                                                                          for (int i = M-1; i >= 0; i--)
                                                                                     {