RU2656580C9 - Определение порядка инициализации статических объектов - Google Patents

Определение порядка инициализации статических объектов Download PDF

Info

Publication number
RU2656580C9
RU2656580C9 RU2014103153A RU2014103153A RU2656580C9 RU 2656580 C9 RU2656580 C9 RU 2656580C9 RU 2014103153 A RU2014103153 A RU 2014103153A RU 2014103153 A RU2014103153 A RU 2014103153A RU 2656580 C9 RU2656580 C9 RU 2656580C9
Authority
RU
Russia
Prior art keywords
objects
file
undefined
static
files
Prior art date
Application number
RU2014103153A
Other languages
English (en)
Other versions
RU2014103153A (ru
RU2656580C2 (ru
Inventor
Евгений Алексеевич Егоров
Герман Викторович Зюзин
Original Assignee
Общество с ограниченной ответственностью "Аби Девелопмент"
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by Общество с ограниченной ответственностью "Аби Девелопмент" filed Critical Общество с ограниченной ответственностью "Аби Девелопмент"
Priority to RU2014103153A priority Critical patent/RU2656580C9/ru
Priority to US14/508,461 priority patent/US10019245B2/en
Publication of RU2014103153A publication Critical patent/RU2014103153A/ru
Publication of RU2656580C2 publication Critical patent/RU2656580C2/ru
Application granted granted Critical
Publication of RU2656580C9 publication Critical patent/RU2656580C9/ru

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/44Arrangements for executing specific programs
    • G06F9/445Program loading or initiating
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/40Transformation of program code
    • G06F8/54Link editing before load time
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F16/00Information retrieval; Database structures therefor; File system structures therefor
    • G06F16/90Details of database functions independent of the retrieved data types
    • G06F16/901Indexing; Data structures therefor; Storage structures
    • G06F16/9024Graphs; Linked lists
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F16/00Information retrieval; Database structures therefor; File system structures therefor
    • G06F16/20Information retrieval; Database structures therefor; File system structures therefor of structured data, e.g. relational data
    • G06F16/24Querying
    • G06F16/245Query processing
    • G06F16/2453Query optimisation
    • G06F16/24532Query optimisation of parallel queries
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F16/00Information retrieval; Database structures therefor; File system structures therefor
    • G06F16/20Information retrieval; Database structures therefor; File system structures therefor of structured data, e.g. relational data
    • G06F16/24Querying
    • G06F16/245Query processing
    • G06F16/2453Query optimisation
    • G06F16/24534Query rewriting; Transformation
    • G06F16/24542Plan optimisation
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/40Transformation of program code
    • G06F8/41Compilation
    • G06F8/43Checking; Contextual analysis
    • G06F8/433Dependency analysis; Data or control flow analysis

Landscapes

  • Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • Software Systems (AREA)
  • General Engineering & Computer Science (AREA)
  • Physics & Mathematics (AREA)
  • General Physics & Mathematics (AREA)
  • Databases & Information Systems (AREA)
  • Data Mining & Analysis (AREA)
  • Stored Programmes (AREA)
  • Devices For Executing Special Programs (AREA)

Abstract

Изобретение относится к компиляции кода программы. Технический результат – повышение эффективности определения порядка инициализации объектов в объектных файлах. Способ определения порядка инициализации статических объектов, находящихся во множестве объектных файлов с помощью процессора, включает определение принадлежности объекта к определенным статическим объектам или неопределенным объектам в каждом объектном файле, построение направленного графа для множества объектных файлов и применение топологической сортировки к направленному графу для установления порядка множества объектных файлов, который гарантирует корректную инициализацию статических объектов. 3 н. и 18 з.п. ф-лы, 8 ил.

Description

[0001] Настоящее изобретение относится, в общем, к программированию, а в частности к компиляции кода программы.
Уровень техники
[0002] Каждая программа на языке С или С++ компилируется из одного или нескольких исходных файлов. Каждый файл может содержать статические объекты (объекты, существующие в течение всего времени исполнения программы), которые инициализируются при запуске программы или при загрузке динамической библиотеки. Инициализация - это процесс вычисления и установки в объект некоторого значения. Компилятор создает объектные файлы из исходных файлов, имеющих расширение .obj в операционных системах (ОС) DOS и Windows® (WINDOWS является зарегистрированным товарным знаком корпорации Microsoft) и расширение .о в системах Linux® (LINUX является зарегистрированным товарным знаком Линуса Торвальдса), которые затем передаются линкеру. Линкер соединяет части кода и создает исполняемый модуль (который в Windows®, например, имеет расширение .com или .ехе) или динамическую библиотеку (например, с расширением .dll в Windows® и расширением .so в Linux®).
[0003] Иногда код написан так, что для инициализации статического объекта из файла А требуется значение другого статического объекта из файла В. В таком случае объект из файла В должен быть уже инициализирован в момент инициализации объекта из файла А.
РАСКРЫТИЕ ИЗОБРЕТЕНИЯ
[0004] При портировании, т.е. при переносе кода в рамках большого проекта, состоящего из десятков и сотен исходных файлов, требуется удостовериться, чтобы все глобальные объекты и статические члены классов инициализировались в правильном порядке. В противном случае скомпилированная программа может выполняться неправильно. Например, предположим, что файл А.срр содержит строку:
int a=10;
[0005] Пусть другой файл того же проекта (файл В.срр) содержит строку:
int b=a+100;
[0006] Предположим, что переменные а и b находятся в разных файлах, при этом стандарт С++ не определяет порядок их инициализации. Если сначала инициализируется объект а, а затем объект b, то объект а будет равен 10, а объект b=объект а+10=110. Если объекты инициализируются в обратном порядке, то на момент инициализации объекта b неявно «предшествующий» ему по смыслу объект А еще не будет инициализирован. Поэтому почти наверняка объект b будет иметь неправильное значение, что может привести к неправильной работе программы.
[0007] Порядок инициализации не задается явно, обычно его определяет линкер. Как правило, порядок компоновки объектных файлов определяется тем порядком, в котором линкер получает их. Обычно команда запуска линкера имеет следующий синтаксис:
linker.exe file.obj another_file.obj one_more_file.obj
[0008] На практике порядок инициализации объектов в исполняемом модуле связан с порядком, в каком объектные файлы передаются линкеру. Это обычно либо прямой порядок (т.е. объекты первого подаваемого линкеру файла инициализируются первыми), либо обратный порядок (т.е. объекты последнего полученного линкером файла инициализируются первыми).
[0009] В дополнение к указанной проблеме стандарт С++ определяет, что все статические объекты инициализируются нулевым значением. При этом простые типы инициализируются нулевым значением, а составные типы инициализируются конструктором по умолчанию. В результате объекту может быть присвоено правильное значение (если порядок инициализации случайно оказался правильным) или нуль.
[0010] При этом если в рассмотренном выше примере объект b инициализирован раньше объекта а, то объект а будет иметь нулевое значение, а не ожидаемое значение 10, а значение объекта b будет равно 100, а не 110. Итак, инициализация нулевыми значениями приводит к появлению ошибок, которые практически невозможно найти и диагностировать. С точки зрения пользователя такая программа будет работать неправильно. С точки зрения программиста, участвующего в портировании кода, не только эта программа будет работать некорректно, но и ни один инструмент программирования или утилита не покажут, где локализована ошибка и в чем она состоит.
[0011] Для решения указанных выше проблем применяются хорошо известные стандартные решения. Например, применяются функции-геттеры или так называемые «nifty counters)) или счетчики Шварца. Другим решением является перенос всех статических объектов в один исходный файл. Еще одно решение заключается в использовании нестандартных (зависящих от компилятора) синтаксических конструкций, например, #pragma init, _attribute_((init_priority(XXX))).
[0012] Несмотря на то, что перечисленные выше способы могут давать удовлетворительные результаты, каждый из них требует ручной доработки, что приводит к чрезвычайно большим затратам времени и усилий при работе с сотнями исходных файлов. Более того, некоторые из этих способов не портируются (поскольку они предназначены для других компиляторов и/или ОС). Совершенно недостаточно просмотреть код на языке С++ в одном отдельном файле и найти конструкции, представляющие собой объявления и/или вызовы статических переменных. Необходимо последовательно открыть, изучить и проанализировать на предмет используемых переменных все остальные исходные файлы проекта.
[0013] Для удовлетворения указанных потребностей предлагаются различные варианты реализации раскрываемого изобретения. Например, в одном из вариантов реализации изобретения в качестве примера раскрывается связанный с использованием процессора способ определения порядка инициализации статических объектов, находящихся в нескольких объектных файлах. В каждом объектном файле объекты разделяются на определенные статические объекты и неопределенные объекты. На основе этих данных строится направленный граф объектных файлов. К направленному графу применяется какой-либо известный способ топологической сортировки для того, чтобы определить порядок объектных файлов, обеспечивающий корректную инициализацию объектов.
[0014] В дополнение к изложенному выше варианту реализации приводятся и другие примеры систем и вариантов реализации раскрываемого изобретения в виде компьютерных программ с указанием их преимуществ.
[0015] В изложенном выше кратком описании изобретения вводится набор понятий в упрощенной форме. Они будут более подробно раскрыты в детальном описании изобретения представленном ниже. Краткое описание изобретения не предназначено для определения основных признаков или важных признаков заявленного изобретения, защищаемого Формулой изобретения, или для определения объема заявленного изобретения. Заявленное изобретение не ограничивается вариантами реализации, которые решают некоторые указанные выше проблемы или все эти проблемы.
КРАТКОЕ ОПИСАНИЕ ЧЕРТЕЖЕЙ.
[0016] Для облегчения понимания всех перечисленных выше преимуществ изобретения в подробном описании будут использоваться ссылки на конкретные варианты его реализации, которые проиллюстрированы на прилагаемых чертежах. Эти чертежи демонстрируют лишь некоторые варианты реализации изобретения. Поэтому возможности применения этого изобретения не ограничиваются содержанием этих рисунков. Для наглядного описания и пояснения сути изобретения и отдельных деталей будут использоваться прилагаемые чертежи, на которых:
[0017] на Рис. 1 представлена блок-схема аппаратного обеспечения, в рамках которой аспекты настоящего изобретения могут быть реализованы;
[0018] на Рис. 2 представлена блок-схема памяти аппаратного обеспечения, показанного на Рис. 1, в рамках которой аспекты настоящего изобретения могут быть реализованы;
[0019] На Рис. 3 представлена блок-схема примера способа определения порядка инициализации статических объектов, расположенных в нескольких объектных файлах, в рамках которой различные аспекты настоящего изобретения могут быть реализованы;
[0020] На Рис. 4 представлена блок-схема, иллюстрирующая один из шагов способа определения порядка инициализации статических объектов, показанных на Рис. 3, в рамках которой аспекты настоящего изобретения могут быть реализованы;
[0021] На Рис. 5 представлена блок-схема, иллюстрирующая один из шагов способа, показанного на Рис. 4, в рамках которой аспекты настоящего изобретения могут быть реализованы; и
[0022] На Рис. 6 представлена блок-схема, иллюстрирующая другой шаг способа определения порядка инициализации статических объектов, показанного на Рис. 3, в рамках которой аспекты настоящего изобретения могут быть реализованы.
[0023] Рис. 7А представляет собой направленный граф, иллюстрирующий пример программного проекта, состоящего из 6 (шести) исходных файлов, в рамках которого аспекты настоящего изобретения могут быть реализованы.
[0024] Рис. 7В представляет собой таблицу, иллюстрирующую возможные варианты порядка объектных файлов, приведенных на Рис. 7А, гарантирующие корректную инициализацию объектов, в рамках которой аспекты настоящего изобретения могут быть реализованы
ОПИСАНИЕ ПРЕДПОЧТИТЕЛЬНЫХ ВАРИАНТОВ РЕАЛИЗАЦИИ
[0025] Как было упомянуто выше, текущие стандарты С и С++ по умолчанию не определяют порядок инициализации статических объектов в разных объектных файлах. Поэтому при разработке кода и портировании существующего кода на другие компиляторы (работающие на разных операционных системах) могут возникнуть проблемы. Иногда они возникают даже при портировании кода на другую версию того же компилятора. В итоге скомпилированная программа работает некорректно.
[0026] Для решения этой проблемы используются различные варианты реализации данного изобретения для определения порядка инициализации объектов в объектных файлах передаваемых линкеру при формировании исполняемого файла. В одном варианте реализации изобретения для каждого объектного файла определяется, какие объекты определены в данном объектном файле, и какие объекты не определены, но используются. Это решение выносится с использованием атрибутов объектов (типов объектов), которые могут быть автоматически прочитаны в каждом объектном файле. Типы объектов могут быть разделены на три основных категории: 1) объект является определенной статической переменной или константой, 2) объект является неопределенным объектом или 3) объект какого-либо другого типа, который потому не представляет интереса. Информация об определенных статических и неопределенных объектах может применяться для построения направленного графа объектных файлов. Используя топологическую сортировку графа, определяется порядок объектных файлов в соответствии с направленным графом, т.е. порядок передачи объектных файлов (.obj) линкеру.
[0027] На Рис. 1 в качестве примера реализации описываемого изобретения приведено аппаратное средство (100), которое может использоваться согласно одному из вариантов реализации данного изобретения. Аппаратное средство (100) обычно содержит по меньшей мере один процессор (102), соединенный с запоминающим устройством (104). Процессор (102) может представлять собой один или несколько процессоров (например, микропроцессоров), а память (104) может представлять собой устройства оперативной памяти (RAM), содержащие основное запоминающее устройство аппаратного средства (100), а также любые дополнительные уровни памяти (например, кэш-память, энергонезависимые или резервные запоминающие устройства, такие как программируемые запоминающие устройства или флэш-накопители), постоянные запоминающие устройства и т.д. Кроме того, память (104) может включать запоминающее устройство, физически расположенное в другом месте аппаратного средства (100), например любую кэш-память в процессоре (102), а также любое запоминающее устройство, используемое в качестве виртуальной памяти, например, запоминающее устройство большой емкости (110). Кроме того, обычно аппаратное средство (100) имеет несколько входов и выходов для обеспечения внешней связи. Для работы с пользователем или оператором аппаратное средство (100), как правило, содержит одно или несколько устройств пользовательского ввода (106), таких как клавиатура, мышь, сканер и дисплей (108) (например, жидкокристаллический дисплей) и/или устройства вывода (не показаны). В качестве дополнительной памяти аппаратное средство 100 может также включать одно или несколько запоминающих устройств большой емкости (110), например, накопитель на дискете или другом съемном диске, накопитель на жестком диске, запоминающее устройство с прямым доступом (DASD), накопитель на оптических дисках (например, накопитель на компакт-диске (CD), накопитель на универсальном цифровом диске формата DVD и т.д.) и/или накопитель на магнитной ленте и пр.
[0028] Кроме того, аппаратное средство (100) может включать интерфейс для взаимодействия с одной сетью или несколькими сетями (112) (например, с локальной сетью (LAN), глобальной сетью (WAN), беспроводной сетью и (или) сетью Интернет и т.д.) для обмена информацией с другими компьютерами, подключенными к этим сетям. Следует иметь в виду, что аппаратное средство (100) обычно включает соответствующие аналоговые и (или) цифровые интерфейсы между процессором (102) и каждым из компонентов (104), (106), (108) и (112), что хорошо известно специалистам в данной области.
[0029] Аппаратное средство (100) работает под управлением операционной системы (114), на нем выполняются различные программные приложения, компоненты, программы, объекты, модули и т.д., которые помечены в совокупности ссылкой номер 116 для реализации описанных выше способов.
[0030] На Рис. 2 приведена блок-схема памяти (104), которая обменивается данными с операционной системой (114) и обеспечивает ее программами для выполнения. Память (104) включает модуль компилятора (202), модуль сортировки (208) и модуль линкера (204). Модуль компилятора (202) обрабатывает исходные файлы для преобразования исходного кода с языка программирования на машинный код. В результате процесса компиляции для каждого исходного файла создается соответствующий объектный файл. Множество объектных файлов подается на модуль сортировки (208), который используя способ данного изобретения, описанного более подробно ниже, составляет список объектных файлов в порядке, гарантирующем корректную инициализацию объектов. Этот список подается в модуль линкера 204, который соединяет объектные файлы и формирует исполняемый файл или динамическую библиотеку. Затем скомпилированная программа (исполняемый файл или динамическая библиотека) может работать корректно.
[0031] На Рис. 3 с помощью блок-схемы представлен пример способа (300) определения порядка инициализации статических объектов, расположенных во множестве объектных файлов. На первом шаге модуль компилятора (202) компилирует исходные файлы в объектные файлы (т.е. файлы с расширением.obj в ОС Windows®) (шаг (302)). Специалистами в данной области известно, что каждый исходный файл компилируется в объектный файл, содержащий ноль или более объектов.
[0032] Далее объекты, которые содержаться в объектных файлах, идентифицируются на шаге (304). Как будет более подробно описано ниже, объекты категоризируются на определенные статические и неопределенные объекты. Затем на шаге (306) с использованием классифицированных объектов из объектных файлов строится направленный граф. «Направленный граф» - это граф или множество соединенных ребрами вершин, причем эти ребра имеют направления. На Рис. 7 представлен направленный граф, построенный в качестве примера для проекта программы из 6 (шести) исходных файлов. Он будет описан более подробно ниже. На шаге 308 направленный граф подвергается топологической сортировке. При этом создается список объектных файлов в порядке, который гарантирует корректную инициализацию объектов (шаг 310). После построения этого списка объектные файлы объединяются в исполняемые файлы или динамическую библиотеку (шаг 312).
[0033] Возвращаясь к шагу 304, каждый объектный файл анализируется для идентификации объектов. На Рис. 4 показана блок-схема примера способа (400) идентификации объектов в объектном файле. Объектный файл открывается на шаге 402. Далее создается список определенных статических объектов (шаг 404), например, в виде служебного файла в формате txt. Создается список неопределенных объектов (шаг 406), например, в виде служебного файла в формате txt. Несмотря на то, что шаг 404 показан предшествующим шагу 406, специалистам в данной области понятно, что шаги 404 и 406 могут производиться в обратном порядке или одновременно. В любом случае оба списка сохраняются на шаге (408). После создания списков определенных статических и неопределенных объектов на шаге (410) определяется, является ли объектный файл последним или нет. Если нет, то способ (400) возвращается к шагу (402) и производит ту же операцию со следующим объектным файлом. Если этот объектный файл является последним, то способ (400) завершает работу и уже готовы списки определенных статических и неопределенных объектов (шаг 412).
[0034] При формировании списков определенных статических и неопределенных объектов (шаги 404 и 406) проверяется каждый объект (от первого до последнего) в каждом объектном файле. На Рис. 5 в виде блок-схемы показан пример метода (500) составления таких списков в виде блок-схемы. На шаге (502), считываются атрибуты объекта в объектном файле, и сам объект определяется либо как определенный статический объект, либо как неопределенный объект, либо как ни то, ни другое. Если данный объект не является ни определенной статической переменной, ни неопределенным объектом (шаг 504), то он не принимается во внимание, и способ (500) переходит к обработке следующего объекта на шаге (506). Если объект определяется как статическая переменная (шаг 508), то он помещается в группу, содержащую другие такие же объекты, и, например, имя этого объекта (например, идентификатор объекта) вносится в список определенных объектов (шаг 510). Если данный объект не является определенным объектом, то он помещается в одну группу с другими неопределенными объектами и, например, его имя вносится в список неопределенных объектов на шаге (512). После внесения объекта в список неопределенных объектов или в список определенных статических объектов сохраняются оба файла со списком неопределенных объектов и со списком определенных статических объектов. Затем определяется, является ли данный объект последним в объектном файле (шаг 514). Если нет, то способ (500) возвращается на шаг (506), и шаг (502) применяется к следующему объекту в данном объектном файле. Иначе способ (500) переходит к обработке следующего объектного файла на шаге (516).
[0035] На Рис. 3 показано, что после анализа всех объектных файлов на основе списков неопределенных и определенных статических объектов строится направленный граф объектных файлов (шаг 304). Например, модуль сортировки (208) строит направленный граф объектных файлов согласно следующим правилам:
a. Вершинами направленного графа являются объектные файлы.
b. Ребро графа от вершины А к вершине В строится, если объект А содержит как минимум один неопределенный объект 01, а объектный файл В содержит определенный статический объект 01 (т.е. объект с тем же именем/идентификатором).
с. Ребро может соединять любые две вершины, если для этих двух вершин выполняется условие b, в том числе возможна пара вершин, которую соединяют два ребра, имеющие противоположные направления (т.е. разрешены циклические зависимости).
[0036] Построенный направленный граф в одном варианте реализации раскрываемого изобретения может использоваться для визуализации состояния переменных в проекте. Например, граф может быть выведен в окно приложения на дисплее (108), сохранен в файле в виде изображения, текста или в любом другом формате. Его можно отправить на печать на принтер, плоттер или любое другое периферийное устройство. Кроме этого, имена (идентификаторы) переменных можно использовать для обозначения ребер при визуализации графа, что позволяет сделать работу с ним наглядной.
[0037] В другом варианте реализации данного изобретения созданный направленный граф можно проанализировать на предмет обнаружения связанных и несвязанных областей, или любых других математических зависимостей. Результаты этого анализа (и сам граф) можно затем использовать прямо или опосредованно.
[0038] Соответственно, использование терминологии, относящейся к «построению», «формированию», «классификации», «идентификации», «созданию» и т.д., может относиться к шагам, обозначенным в электронным и/или физическим образом, поддерживаемым процессором (102).
[0039] Затем построенный направленный граф (шаг 308) подвергается топологической сортировке с помощью любого известного способа. Применение топологической сортировки может привести, а может не привести к формированию списка всех вершин графа (т.е. списка объектных файлов), которые не содержат дуг, идущих от более ранних вершин к более поздним вершинам. На Рис. 6 представлена блок-схема способа (600) построения типологически отсортированного списка объектных файлов. После применения топологической сортировки к построенному направленному графу (шаг 602) получившийся список используется для определения порядка объектных файлов, который гарантирует корректную инициализацию объектов на шаге 606. Это возможно, если список всех вершин графа не содержит ребер, идущих от более ранних вершин к более поздним вершинам (на шаге 604). В зависимости от конкретной операционной системы инициализация может производиться в прямом или обратном порядке в зависимости от порядка поступления объектных файлов в модуль линкера (204).
[0040] Если такой список невозможно построить (на шаге 604), то выполняется шаг для обнаружения (608) одной или нескольких циклических зависимостей или циклов в построенном направленном графе. В одном из способов реализации изобретения информация об обнаруженных циклических зависимостях (например, списки пар вершин, образующих циклические зависимости) может быть выведена в окно приложения на дисплее (108) в виде текста. В другом варианте реализации данного изобретения обнаруженные циклические зависимости могут графически изображены на всей схеме построенного направленного графа, могут быть выделены каким-либо цветом или обозначены иным способом. После обнаружения циклические зависимости исправляются на шаге 610. Например, в варианте реализации способа (600) списки обнаруженных циклических зависимостей могут впоследствии использоваться при автоматической обработке проекта. Например, для автоматической передачи соответствующих пар файлов программисту, ответственному за поиск и устранение проблем инициализации. Обычно число циклических зависимостей невелико (порядка 3-5 циклических зависимостей) даже в очень больших проектах (которые включают порядка 500-1000 объектных файлов). Поэтому их можно легко и полностью исправить вручную. Исправление циклической зависимости может заключаться в переносе одной переменной в другой исходный файл, использовании функции-геттера или какого-либо другого известного способа.
[0041] В некоторых случаях при применении описываемого способа обнаружения циклической зависимости в направленном графе возможно наличие «ложных» циклических зависимостей. То есть направленный граф может содержать цикл, но реальной циклической зависимости в инициализации статических переменных в коде при этом нет. Для разрешения таких ситуаций может применяться алгоритм, позволяющий безусловно задать направление ребра между двумя объектными файлами, например, «объектный файл А должен быть инициализирован прежде объектного файла В». В таком случае связь между вершинами строится не по правилу b (т.е. «ребро графа от вершины А к вершине В строится, если объектный файл А содержит как минимум один неопределенный объект 01, а объектный файл В содержит определенный статический объект 01»), а по правилу, явно заданному этим алгоритмом.
[0042] После исправления циклических зависимостей способ возвращается на шаг (604). Поскольку список должен составляться после исправления циклических зависимостей, способ (600) переходит к выполнению шага (606).
[0043] На Рис. 7А изображен направленный граф, построенный для небольшого проекта согласно варианту реализации данного изобретения. Исходный код небольшого проекта записан в 6 (шести) файлах. Вершины этого графа представляют собой объектные файлы А, В, С, D, Е и F, они получены в результате компиляции исходных файлов. Объектный файл А (701) содержит по меньшей мере один неопределенный объект, который определен в объектном файле В, на что указывает ребро (702), идущее от файла А к файлу В. Таким образом, в списке объектных файлов, полученном в результате топологической сортировки графа, объектный файл В будет находится перед файлом А, и статические объекты объектного файла В будут инициализированы раньше статических объектов из объектного файла А. В противном случае программа может работать некорректно. Объектный файл F является примером объектного файла, который не содержит никаких неопределенных объектов или определенных статических объектов, используемых в другом объектном файле. Поэтому объекты, определенные в объектном файле F, могут быть инициализированы в любой момент времени.
[0044] На Рис. 7В приведена таблица с возможными порядками объектных файлов, которые гарантируют корректную инициализацию объектов, т.е. запуск программы без ошибок. Двойные стрелки, расположенные вне таблицы, указывают на пары файлов, которые можно поменять местами в соответствующих последовательностях. Например, в варианте 1 можно поменять местами объектные файлы А и Е, а в варианте 2 можно провести поменять местами объектные файлы D и А. Перемена местами этих файлов не вызовет ошибок во время инициализации объектов при запуске программы.
[0045] Специалистам в данной области ясно, что аспекты раскрываемого изобретения могут быть реализованы в виде системы, способа или программного продукта для компьютера. Таким образом, аспекты данного изобретения могут иметь исключительно аппаратную реализацию, исключительно программную реализацию (включая встроенное программное обеспечение, резидентное программное обеспечение, микрокоманды и т.д.) либо вариант реализации, в котором сочетаются программные и аппаратные компоненты, что в целом может называться в этом документе «схемой», «модулем» или «системой». Кроме того, аспекты раскрываемого изобретения могут принимать форму программного продукта для компьютера, записанного на один машиночитаемый носитель или на несколько машиночитаемых носителей, содержащих машиночитаемый программный код.
[0046] Может использоваться любая комбинация одного машиночитаемого носителя или нескольких машиночитаемых носителей. Машиночитаемый носитель может представлять собой содержащую сигналы машиночитаемую среду или машиночитаемый носитель данных. Например, машиночитаемый носитель данных может, помимо прочего, представлять собой электронную, магнитную, оптическую, электромагнитную, инфракрасную или полупроводниковую систему, аппарат или устройство, либо любую подходящую комбинацию перечисленного выше. Более конкретные примеры машиночитаемых носителей включают следующее (неполный список): электрическое соединение, содержащее один проводник или более, портативный компьютерный гибкий диск, жесткий диск, оперативное запоминающее устройство (ОЗУ), постоянное запоминающее устройство (ПЗУ), перезаписываемое программируемое постоянное запоминающее устройство (ППЗУ или флэш-память), оптическое волокно, портативный компакт-диск для однократной записи данных (CD-ROM), оптическое запоминающее устройство, магнитное запоминающее устройство или любую подходящую комбинацию перечисленного выше. В контексте этого документа машиночитаемый носитель данных может быть любым материальным носителем данных, который может содержать или хранить программу для использования выполняющей команды системой, аппаратом или устройством, либо который можно подключить к выполняющей команды системе, аппарату или устройству.
[0047] Записанный в машиночитаемом носителе программный код может передаваться с использованием любой подходящей среды, включая, помимо прочего, следующие среды: беспроводная среда, проводная среда, оптоволоконный кабель, радиочастотная среда и т.д., либо с помощью любой подходящей комбинации перечисленных выше сред. Компьютерный программный код для выполнения операций для аспектов раскрываемого изобретения может быть написан в виде любой комбинации на одном или нескольких языках программирования, включая объектно-ориентированные языки программирования, такие как Java, Smalltalk, С++ и т.п., а также традиционные процедурные языки программирования, такие как язык программирования С или похожие языки программирования. Код программы может выполняться полностью на компьютере пользователя, частично на компьютере пользователя как автономный пакет программного обеспечения, частично на компьютере пользователя и частично на удаленном компьютере или полностью на удаленном компьютере или сервере. В последнем сценарии удаленный компьютер может быть соединен с компьютером пользователя по сети любого типа, в том числе по локальной сети (LAN) или по глобальной сети (WAN), либо может быть организовано соединение с внешним компьютером (например, по сети Интернет с использованием поставщика услуг Интернета).
[0048] Особенности раскрываемого изобретения были описаны выше со ссылкой на структурные схемы и/или блок-схемы способов, устройств (систем) и программных продуктов для компьютеров в соответствии с вариантами реализации изобретения. Следует понимать, что каждый блок на иллюстративной блок-схеме и/или комбинация блоков в иллюстративной блок-схеме и/или блок-схемах может быть осуществлен с помощью команд программы для компьютера. Эти команды программы для компьютера могут быть переданы процессору универсального компьютера, специализированного компьютера или другого программируемого устройства обработки данных для получения машины, таким образом, чтобы команды, которые выполняются в процессоре компьютера или в другом программируемого устройства обработки данных, создали средства для реализации функций или действий, указанных в блоках или блоках структурной схемы и/или блок-схемы.
[0049] Эти команды компьютерной программы также могут храниться в машиночитаемом носителе, который может заставить компьютер, другое программируемое устройство обработки данных или другие устройства работать определенным образом так, чтобы эти команды, хранящиеся в машиночитаемом носителе, производили изделие, в том числе команды, реализующие функцию или действие, предусмотренное в блоке или блоках структурной схемы и/или блок-схемы. Команды компьютерной программы также могут быть загружены на компьютер, на другое программируемое устройство обработки данных или на другие устройства, чтобы вызвать выполнение последовательностей рабочих этапов, которые должны выполняться в компьютере, другом программируемом устройстве или в других устройствах для выполнения реализованного в компьютере процесса таким образом, чтобы команды, которые выполняются на компьютере или на другом программируемом устройстве, предоставляли процессы для выполнения функций или действий, предусмотренных в блоке или блоках структурной схемы и/или блок-схемы.
[0050] Структурные схемы или блок-схемы, приведенные на рисунках, иллюстрируют архитектуру, функциональность и работу возможных вариантов реализации систем, способов и компьютерных программных продуктов в соответствии с различными вариантами реализации раскрываемого изобретения. В связи с этим каждый блок в структурной схеме или блок-схеме может представлять собой модуль, часть кода или сегмент, который содержит одну или более исполняемых команд для реализации указанной логической функции (указанных логических функций). Следует также отметить, что в некоторых альтернативных вариантах реализации отмеченные в блоке функции могут выполняться в порядке, отличном от того, который указан на рисунках. Например, два блока, которые показаны как последовательные, фактически могут выполняться по существу одновременно, либо иногда блоки могут выполняться в обратном порядке, в зависимости от используемой функциональности. Кроме того, следует отметить, что каждый блок структурной схемы и/или блок-схемы и комбинации блоков в структурных схемах и/или блок-схемах могут быть реализованы с помощью специальных систем аппаратного обеспечения, которые выполняют заданные функции или действия, или с помощью комбинации специализированного аппаратного обеспечения и компьютерных команд.

Claims (70)

1. Способ определения порядка инициализации статических объектов, находящихся во множестве объектных файлов, с помощью процессора, включающий:
определение принадлежности объекта к определенным статическим объектам или неопределенным объектам в каждом объектном файле;
построение направленного графа для множества объектных файлов;
и применение топологической сортировки к направленному графу для установления порядка множества объектных файлов, который гарантирует корректную инициализацию статических объектов.
2. Способ по п. 1, отличающийся тем, что каждый объектный файл содержит объекты, который дополнительно включает:
идентификацию принадлежности объектов в каждом объектном файле к определенным статическим объектам, неопределенным объектам или ни к определенным статическим объектам, ни к неопределенным объектам; и
исключение из рассмотрения объектов, не определенных как определенные статические объекты или неопределенные объекты.
3. Способ по п. 2, отличающийся тем, что:
шаг идентификации объектов включает для первого объекта первого объектного файла считывание атрибута первого объекта первого объектного файла для определения принадлежности первого объекта в объектном файле к определенному статическому объекту, неопределенному объекту или ни к определенному статическому объекту, ни к неопределенному объекту;
группировку первого объекта первого объектного файла с другими определенными статическими объектами первого объектного файла, если первый объект был определен как определенный статический объект;
группировку первого объекта первого объектного файла с другими неопределенными объектами первого объектного файла, если первый объект был определен как неопределенный объект; и
переход ко второму объекту первого объектного файла, если установлено, что первый объект первого объектного файла не является ни определенным статическим объектом, ни неопределенным объектом.
4. Способ по п. 1, отличающийся тем, что:
направленный граф содержит вершины, каждая из которых представляет собой объектный файл, причем ребро графа из первой вершины ко второй вершине образуется, если первый объектный файл содержит по меньшей мере один неопределенный объект, а второй объектный файл содержит определенный статический объект с тем же именем; и
при выполнении шага топологической сортировки составляется список всех вершин, которые не содержат никаких ребер, ведущих от более ранней вершины к одной или нескольким более поздним вершинам.
5. Способ по п. 1, дополнительно включающий:
определение возможности составления списка на основе топологически отсортированного направленного графа; и
если такой список может быть составлен, то создание его для определения порядка множества объектных файлов, который гарантирует корректную инициализацию статических объектов.
6. Способ по п. 1, дополнительно включающий:
определение возможности составления списка на основе топологически отсортированного направленного графа;
если такой список не может быть составлен, то определение одной или нескольких пар объектных файлов во множестве объектных файлов, образующих одну или несколько циклических зависимостей; и
устранение одной или нескольких циклических зависимостей.
7. Способ по п. 1, отличающийся тем, что множество статических объектов находится во множестве различных объектных файлов.
8. Система для определения порядка инициализации статических объектов, находящихся во множестве объектных файлов, отличающаяся тем, что эта система включает:
процессор, который:
определяет принадлежность объектов в каждом объектном файле к определенным статическим объектам или неопределенным объектам;
строит направленный граф для множества объектных файлов;
и применяет топологическую сортировку к направленному графу для получения порядка множества объектных файлов, который гарантирует корректную инициализацию статических объектов.
9. Система по п. 8, отличающаяся тем, что каждый объектный файл содержит объекты и процессор дополнительно:
для каждого объектного файла проводит идентификацию принадлежности объектов в объектном файле к определенным статическим объектам, неопределенным объектам или ни к определенным статическим объектам, ни неопределенным объектам; и
исключает из рассмотрения объекты, не определенные как определенные статические объекты или неопределенные объекты.
10. Система по п. 9, отличающаяся тем, что этот процессор дополнительно:
при идентификации статических объектов для первого объекта первого объектного файла считывает атрибут первого объекта первого объектного файла для определения принадлежности первого объекта в первом объектном файле к определенному статическому объекту, неопределенному объекту или ни к определенному статическому объекту, ни к неопределенному объекту;
группирует первый объект первого объектного файла с другими определенными статическими объектами первого объектного файла, если этот первый объект был определен как определенный статический объект;
группирует первый объект первого объектного файла с другими неопределенными объектами первого объектного файла, если этот первый объект был определен как неопределенный объект; и
переходит ко второму объекту первого объектного файла, если первый объект первого объектного файла не был определен как определенный статический объект или неопределенный объект.
11. Система по п. 8, отличающаяся тем, что в ее процессоре:
направленный граф содержит вершины, каждая из которых представляет собой объектный файл, причем ребро графа из первой вершины ко второй вершине образуется, если первый объектный файл содержит по меньшей мере один неопределенный объект, а второй объектный файл содержит определенный статический объект с тем же именем; и
при выполнении шага топологической сортировки составляется список всех вершин, которые не содержат никаких ребер, идущих от более ранней вершины к одной или нескольким более поздним вершинам.
12. Система по п. 8, отличающаяся тем, что этот процессор дополнительно:
определяет, возможно ли составление списка из топологически отсортированного направленного графа; и
если этот список может быть составлен, то создает такой список, определяющий порядок множества объектных файлов, который гарантирует корректную инициализацию статических объектов.
13. Система по п. 8, отличающаяся тем, что этот процессор дополнительно:
определяет возможность составления списка на основе топологически отсортированного направленного графа;
если такой список не может быть составлен, то он определяет одну пару или несколько пар объектных файлов во множестве объектных файлов, формирующих одну или несколько циклических зависимостей;
исправляет одну или несколько циклических зависимостей.
14. Система по п. 8, отличающаяся тем, что множество статических объектов находится во множестве различных объектных файлов.
15. Машиночитаемый носитель, содержащий выполняемые процессором компьютера команды для осуществления способа определения порядка инициализации статических объектов, находящихся во множестве объектных файлов, при этом указанный способ включает:
определение принадлежности объектов в каждом объектном файле к определенным статическим объектам или к неопределенным объектам;
построение направленного графа для множества объектных файлов; и
применение топологической сортировки к направленному графу с целью определения порядка множества объектных файлов, который гарантирует корректную инициализацию статических объектов.
16. Машиночитаемый носитель по п. 15, отличающийся тем, что каждый объектный файл содержит объекты, и дополнительно включает:
идентификацию принадлежности объектов в объектном файле к определенным статическим объектам, к неопределенным объектам или ни к тем, ни к другим; и
исключение из рассмотрения объектов, не принадлежащих к статически определенным объектам и к неопределенным объектам.
17. Машиночитаемый носитель по п. 16, отличающийся тем, что:
идентификация объектов включает для первого объекта первого объектного файла чтение атрибута первого объекта первого объектного файла для определения принадлежности первого объекта первого объектного к определенному статическому объекту, к неопределенному объекту или ни к определенному статическому объекту, ни к неопределенному объекту; и
группировку первого объекта первого объектного файла с другими определенными статическими объектами первого объектного файла, если этот первый объект был определен как определенный статический объект;
группировку первого объекта первого объектного файла с другими неопределенными объектами первого объектного файла, если этот первый объекта был определен как неопределенный объект; и
переход ко второму объекту первого объектного файла, если было определено, что первый объект первого объектного файла не принадлежит ни к определенному статическому объекту, ни к неопределенному объекту.
18. Машиночитаемый носитель по п. 15, отличающийся тем, что:
направленный граф содержит вершины, каждая из которых представляет собой объектный файл, причем ребро графа из первой вершины ко второй вершине образуется, если первый объектный файл содержит по меньшей мере один неопределенный объект, а второй объектный файл содержит определенный статический объект с тем же именем; и
при выполнении шага топологической сортировки составляется список всех вершин, которые не содержат никаких ребер, ведущих от более ранней вершины к одной или нескольким более поздним вершинам.
19. Машиночитаемый носитель по п. 15, дополнительно содержащий:
определение возможности составления списка на основе топологически отсортированного направленного графа; и
если этот список может быть составлен, создание такого списка, определяющего порядок множества объектных файлов, гарантирующего корректную инициализацию статических объектов.
20. Машиночитаемый носитель по п. 15, дополнительно содержащий:
определение возможности составления списка на основе топологически отсортированного направленного графа;
если этот список не может быть составлен, определение одной или нескольких пар объектных файлов во множестве объектных файлов, образующих одну или несколько циклических зависимостей; и
исправление одной или нескольких циклических зависимостей.
21. Машиночитаемый носитель по п. 15, отличающийся тем, что статические объекты находятся во множестве различных объектных файлов.
RU2014103153A 2014-01-30 2014-01-30 Определение порядка инициализации статических объектов RU2656580C9 (ru)

Priority Applications (2)

Application Number Priority Date Filing Date Title
RU2014103153A RU2656580C9 (ru) 2014-01-30 2014-01-30 Определение порядка инициализации статических объектов
US14/508,461 US10019245B2 (en) 2014-01-30 2014-10-07 Resolving an initialization order of static objects

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
RU2014103153A RU2656580C9 (ru) 2014-01-30 2014-01-30 Определение порядка инициализации статических объектов

Publications (3)

Publication Number Publication Date
RU2014103153A RU2014103153A (ru) 2015-08-10
RU2656580C2 RU2656580C2 (ru) 2018-06-05
RU2656580C9 true RU2656580C9 (ru) 2020-01-22

Family

ID=53679261

Family Applications (1)

Application Number Title Priority Date Filing Date
RU2014103153A RU2656580C9 (ru) 2014-01-30 2014-01-30 Определение порядка инициализации статических объектов

Country Status (2)

Country Link
US (1) US10019245B2 (ru)
RU (1) RU2656580C9 (ru)

Families Citing this family (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US20170351683A1 (en) * 2016-06-07 2017-12-07 Salesforce.Com, Inc. Hierarchical data insertion
RU2688250C1 (ru) * 2018-08-14 2019-05-21 Илья Александрович Шарков Способ отображения содержимого персональной базы данных на экране эвм
US11861337B2 (en) * 2020-08-26 2024-01-02 Micron Technology, Inc. Deep neural networks compiler for a trace-based accelerator
CN113032046A (zh) * 2021-03-29 2021-06-25 北京字节跳动网络技术有限公司 so文件的修复方法、装置、设备及存储介质

Citations (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US6832369B1 (en) * 2000-08-01 2004-12-14 International Business Machines Corporation Object oriented method and apparatus for class variable initialization
RU2386999C2 (ru) * 2004-07-09 2010-04-20 Майкрософт Корпорейшн Реализация совместно исполняющихся программ на объектно-ориентированных языках
US20100138819A1 (en) * 2008-11-29 2010-06-03 International Business Machines Corporation Type merging technique to reduce class loading during java verfication
RU2009125011A (ru) * 2006-12-01 2011-01-10 Мюрекс С.А.С. (Fr) Инфраструктура графоориентированного программирования на основе производителей с поддержкой сценариев

Family Cites Families (13)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US6314558B1 (en) * 1996-08-27 2001-11-06 Compuware Corporation Byte code instrumentation
US7519542B1 (en) * 2001-08-14 2009-04-14 Versata Development Group, Inc. System and method for modeling and applying a people network representation
US7908163B2 (en) * 2005-07-15 2011-03-15 The Board Of Trustees Of The University Of Alabama Method and system for parallel scheduling of complex dags under uncertainty
US7895666B1 (en) * 2006-09-01 2011-02-22 Hewlett-Packard Development Company, L.P. Data structure representation using hash-based directed acyclic graphs and related method
US8332833B2 (en) * 2007-06-04 2012-12-11 International Business Machines Corporation Procedure control descriptor-based code specialization for context sensitive memory disambiguation
US8201176B2 (en) * 2008-08-06 2012-06-12 International Business Machines Corporation Detecting the starting and ending of a task when thread pooling is employed
US9329845B2 (en) * 2009-06-04 2016-05-03 Microsoft Technology Licensing, Llc Determining target types for generic pointers in source code
US8793690B2 (en) * 2009-10-09 2014-07-29 International Business Machines Corporation Generating timing sequence for activating resources linked through time dependency relationships
US8719802B2 (en) * 2010-09-30 2014-05-06 Nec Laboratories America, Inc. Interprocedural exception method
US9600411B2 (en) * 2011-01-31 2017-03-21 The Mathworks, Inc. System and method for determining an object's lifetime in an object oriented environment
US9038033B1 (en) * 2011-12-09 2015-05-19 Sencha, Inc. Techniques and mechanisms for web application minification
US9171102B1 (en) * 2013-02-22 2015-10-27 Ca, Inc. Topological sorting of cyclic directed graphs
US9329899B2 (en) * 2013-06-24 2016-05-03 Sap Se Parallel execution of parsed query based on a concurrency level corresponding to an average number of available worker threads

Patent Citations (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US6832369B1 (en) * 2000-08-01 2004-12-14 International Business Machines Corporation Object oriented method and apparatus for class variable initialization
RU2386999C2 (ru) * 2004-07-09 2010-04-20 Майкрософт Корпорейшн Реализация совместно исполняющихся программ на объектно-ориентированных языках
RU2009125011A (ru) * 2006-12-01 2011-01-10 Мюрекс С.А.С. (Fr) Инфраструктура графоориентированного программирования на основе производителей с поддержкой сценариев
US20100138819A1 (en) * 2008-11-29 2010-06-03 International Business Machines Corporation Type merging technique to reduce class loading during java verfication

Also Published As

Publication number Publication date
RU2014103153A (ru) 2015-08-10
US10019245B2 (en) 2018-07-10
RU2656580C2 (ru) 2018-06-05
US20150213113A1 (en) 2015-07-30

Similar Documents

Publication Publication Date Title
US11481200B1 (en) Checking source code validity at time of code update
US8122440B1 (en) Method and apparatus for enumerating external program code dependencies
US11693846B2 (en) Verifying data structure consistency across computing environments
US9817643B2 (en) Incremental interprocedural dataflow analysis during compilation
US10514898B2 (en) Method and system to develop, deploy, test, and manage platform-independent software
US9542170B2 (en) Development tool for footprint reduction
US10296311B2 (en) Finding uninitialized variables outside the local scope
Cingolani et al. BigDataScript: a scripting language for data pipelines
RU2656580C9 (ru) Определение порядка инициализации статических объектов
US20150067653A1 (en) Automatic generation of analysis-equivalent application constructs
US20140089738A1 (en) System and method for identifying source of run-time execution failure
US8516453B2 (en) Partition-based static analysis of computer software applications
US9396239B2 (en) Compiling method, storage medium and compiling apparatus
CN111240987A (zh) 移植程序检测方法、装置、电子设备及计算机可读存储介质
US11983090B2 (en) Setting breakpoints for source code segments enclosed by macros
US11947966B2 (en) Identifying computer instructions enclosed by macros and conflicting macros at build time
Barabanova et al. Modeling and Investigating a Race Condition Detection Algorithm for Multithread Computational Systems
US11675593B2 (en) Dynamically updating a dynamic library
US11755458B2 (en) Automatic software behavior identification using execution record
JP7410269B2 (ja) テスト・ベクタを使用した高水準コンストラクトの最適化の自動検証
Mukelabai et al. Semi-automated test-case propagation in fork ecosystems
CN103577170A (zh) 网络应用的构建方法及装置
US9910645B2 (en) Incremental build generation
CN114327497A (zh) 一种代码处理方法、装置及设备
CN112181519A (zh) 一种数据加工的方法、装置、设备及存储介质

Legal Events

Date Code Title Description
PC43 Official registration of the transfer of the exclusive right without contract for inventions

Effective date: 20181121

TK4A Correction to the publication in the bulletin (patent)

Free format text: CORRECTION TO CHAPTER -FG4A- IN JOURNAL 16-2018 FOR INID CODE(S) (54)

TH4A Reissue of patent specification
QB4A Licence on use of patent

Free format text: LICENCE FORMERLY AGREED ON 20201211

Effective date: 20201211

QC41 Official registration of the termination of the licence agreement or other agreements on the disposal of an exclusive right

Free format text: LICENCE FORMERLY AGREED ON 20201211

Effective date: 20220311