Научная статья на тему 'Метод поиска обращений по некорректному индексу к строкам C++'

Метод поиска обращений по некорректному индексу к строкам C++ Текст научной статьи по специальности «Компьютерные и информационные науки»

CC BY
301
29
i Надоели баннеры? Вы всегда можете отключить рекламу.
Ключевые слова
C++ / STL / СТАТИЧЕСКИЙ АНАЛИЗ / CLANG STATIC ANALYZER / СТРОКОВОЕ ПЕРЕПОЛНЕНИЕ

Аннотация научной статьи по компьютерным и информационным наукам, автор научной работы — Сидорин А.В.

Статья посвящена поиску обращений по некорректному индексу к строковым объектам языка C++. В отличие от переполнений строк C, данный дефект крайне редко обнаруживается промышленными статическими анализаторами в связи со сложностью моделирования данных объектов. В настоящей работе формализованы критерии обнаружения дефекта, а также разработаны формальные правила моделирования методов строк C++ и ряда функций стандартной библиотеки шаблонов языка C++. Данные правила позволяют выполнять моделирование длины строки и индекса обращения к строке. Разработаны правила, позволяющие выполнять межпроцедурный анализ с использованием резюме анализируемой функции. В данной работе производится моделирование только длины строки, что является компромиссом между точностью поиска и объёмом обрабатываемой информации. На основе разработанных правил моделирования реализован проверяющий модуль для статического анализатора Clang Static Analyzer, использующего метод символьного выполнения для анализа возможных путей выполнения программы.

i Надоели баннеры? Вы всегда можете отключить рекламу.

Похожие темы научных работ по компьютерным и информационным наукам , автор научной работы — Сидорин А.В.

iНе можете найти то, что вам нужно? Попробуйте сервис подбора литературы.
i Надоели баннеры? Вы всегда можете отключить рекламу.

Текст научной работы на тему «Метод поиска обращений по некорректному индексу к строкам C++»

Ссылка на статью:

// Наука и Образованно. МГТУ им. Н.Э. Баумана. Электрон. журн. 2016. Л* 6. С. 175 186.

DOI: 10.7463/0516.0840726

Дата: 23.05.2016

© МГТУ им. Н.Э. Баумана

УДК 004.4'2

Метод поиска обращений по некорректному индексу к строкам С++

Сидорин А. В."'"' +aloxoy.v.sidorin®yandox.ru

1000 «Московский исследовательский центр Самсунг». Москва, Россия

Статья посвящена поиску обращений по некорректному индексу к строкам С--.

В отличие от переполнений строк С, данный дефект крайне редко обнаруживается промышленными статическими анализаторами. Формализованы критерии обнаружения

дефекта. Разработаны формальные правила моделирования методов строк С--и ряда

функций стандартной библиотеки шаблонов языка С--. Данные правила позволяют

выполнять моделирование длины строки и индекса обращения к строке. Реализован проверяющий модуль для статического анализатора Clang Static Analyzer. Результаты ручной проверки срабатываний проверяющего модуля подтвердили высокую точность, достаточную для применения в промышленном статическом анализаторе.

Ключевые слова: С--, STL, статический анализ, строковое переполнение, Clang Static

Analyzer

Введение

С увеличением сложности программного обеспечения быстро растут затраты на его тестирование. Ручное тестирование крупных программных проектов занимает много времени, требует большого количества специалистов, однако не гарантирует полного или даже приемлемого покрытия программы. В связи с этим в настоящее время всё большое распространение получают инструменты, предназначенные дня поиска дефектов в программном коде статического анализа кода.

Строки STL (класс std: : string) являются одним из наиболее часто используемых

возможностей, предоставляемых стандартной библиотекой языка С--|1|, Это

обусловлено тем, что практически любая программа нуждается в средствах текстового

представления информации и её обработки. Вместе с тем, строки С--, как и многие

реализации строк других языков, подвержены проблеме обращения к строке по некорректному индексу, выходящему за продолы строки.

Дня обращения к одиночным элементам строки STL можно использовать метод at О и оператор []. Индекс при обращении к элементам строки не должен превышать длины

Наука и Образование

МГТУ им. Н.Э. Баумана

Сете,вое научное издание

ISSN 1994-0408

строки (включая завершающий элемент). В противном случае, при использовании метода а1;() должно быть сгенерировано исключение; при использовании оператора [] проверка индекса на корректность не выполняется, и поведение программы в этом случае не определено. Следствием подобного дефекта может стать аварийное завершение программы и искажение данных, с которыми работает программа, а также нарушения безопасности, что позволяет классифицировать данный дефект как критический |2|. Этот класс дефектов определён в классификации СБИТ как БТИБ-З-СРР |3|.

Поиск подобных дефектов с помощью статического анализа является достаточно сложной задачей. В связи с высокой критичностью данного вида дефектов, статическому поиску строковых переполнений дня языка С посвящено много работ. Дня поиска подобных дефектов используются различные методы: символьное выполнение |4, 5|, абстрактная интерпретация |6|, анализ потоков данных |8, 9|,

однако исследования данного дефекта дня строк С--найти значительно сложное.

Частично это объясняется тем, что многие виды операций со строками С невозможно

осуществить тривиальным способом со строками С--(например, заполнение с

помощью вргл-г^О), однако полностью эта проблема не решена. Сложность реализации строк в стандартной библиотеке языка затрудняет непосредственный анализ функций библиотеки. Реализация многих функций содержит циклы и вызовы других функций, что делает невозможным точный анализ, а также увеличивает его

время. В связи с этим, переполнения строк С--редко могут быть найдены даже с

использованием промышленных статических анализаторов.

Настоящая работа посвящена поиску обращений к строкам С--но некорректному

индексу. Практический интерес связан с использованием языка С--дня

программирования в ОС Тляеп. В настоящей работе представлен способ поиска

дефектов, связанных с обращенном к строкам С--но некорректному индексу, с

использованием метода символьного выполнения |7|, Особенность работы заключается в отсутствии моделирования содержимого строки. В данной работе моделируется только длина строки, что является компромиссом между точностью поиска и объёмом обрабатываемой информации. Кроме того, поиск дефектов производится с помощью статического анализа, без необходимости выполнения прогонов анализируемой программы.

1. Формализация условия переполнения

Пусть Ь — символьное значение длины строки, I — символьное значение индекса обращения. Каждому из символьных значений соответствует множество конкретных целочисленных значений, которые эти символьные значения могут принимать: I € Ь, ге I.

По определению дефекта, строковое переполнение в случае строк С--происходит

в случае обращения по индексу, превышающему длину строки (I > L), Такие переполнения обозначим StrictOverflow(L, I). В терминах удовлетворимости (Sat) и неудовлетворимости (Unsat) условий наступления данное событие можно записать в виде правила логического вывода следующим образом:

(Sat(I > L) Л Unsat(I ^ L)) ^ StrictOverflow(L, I),

или, используя множества конкретных значений,

(Vi е I, Vl е L : i>l) ^ StrictOver flow(L,I). (1)

Дня удобства моделирования с помощью метода символьного выполнения, использующего ветвление состояний, правило 1 можно записать следующим образом:

((3i е I, 3l е L : i>l) Л ($(i е I,l е L) : i ^ l)) ^ StrictOverflow(L, I). (2)

Данное правило выражает условие строгого переполнения в том смысле, что оно не диагностирует случаи, при которых строковое переполнение может как произойти, так и не произойти. Строгость условия переполнения нужна дня устранения возможных .ножных срабатываний, происходящих из-за недостатка информации о контексте вызова анализируемого программного кода,

В отдельную категорию имеет смысл вынести обращения по отрицательному

индексу, В отличие от строк С, строки С--не допускают относительной адресации,

поэтому тин индекса является беззнаковым, и отрицательный индекс является просто очень большим числом. Обращение по такому индексу, хотя и потенциально допустимо, наверняка свидетельствует о наличии ошибки в программе и также приведёт к

StrictUnderflow(L, I)

выразив её формальным образом в терминах удовлетворимости, получим правило 3:

(Sat(I > SIZE_MAX/2) Л Unsat(I ^ SIZE_MAX/2)) ^ StrictUnderflow(L,I), (3)

которое в терминах множеств конкретных значений записывается в виде правила 4:

(Vi е I : i > SIZE_MAX/2) ^ StrictUnder flow(L, I), (4)

где SIZE_MAX — максимальное значение типа size_t, i > /2

беззнаковым и служит дня проверки наличия установленного старшего бита индекса. Дня использования анализа методом символьного выполнения правило 4 можно преобразовать следующим образом:

((3i : i е I Л i > SIZE_MAX/2) Л ($i : i е I Л i ^ SIZE_MАХ/2)) ^

(5)

^ StrictUnderflow(L,I).

В отдельную категорию также можно вынести потенциальные переполнения, связанные с тем, что используемый индекс получен из недоверенного источника (Tainted(I) ^ true). Такие переполнения могут использоваться дня целенаправленной атаки па приложение с использованием специально сформированного пользовательского ввода, В данном случае можно ослабить требование строгого переполнения и выдавать предупреждение дня случаев возможного, а не строгого, переполнения. Данное условие переполнения обозначим TaintedOverf low(L, I) и формализуем следующим образом:

((3i е I, 3l е L : i > l) Л Tainted(I)) ^ T aintedOverf low (L, I). (6)

Полученный набор формальных правил поиска переполнения строки, включающий условия 2, 5 и 6, будем использовать при моделировании оператора взятия индекса у строки класса std:: string и метода at О этого класса и обозначим как условие SignalOver flow(L, I):

StrictOverflow(L, I) V StrictUnderflow(L, I) V TaintedOver flow(L, I) ^

^ SignalOverflow(L, I).

2. Моделирование длины строки

Дня корректного логического вывода необходимо иметь возможность корректно вычислять как длину строки и соответствующее ей множество конкретных значений,

так и значение индекса. Вместе с тем, моделирование длины строки С--затруднено из-

за большого количества методов класса и функций STL, изменяющих строку, а также значительного количества их перегрузок, т. е. функций, имеющих одинаковое имя, по разные тины или количества параметров. В данном раздело приведены формальные правила, позволяющие с достаточной точностью моделировать методы и операторы работы со строками с цслыо корректного определения возможной длины строки.

Нужно заметить, что моделирование строк С--тесно связано с моделированием

строк С, поскольку многие рассматриваемые функции и методы принимают строки С в качестве аргументов. Эта тема выходит за рамки данной работы. В программной реализации данной работы дня моделирования строк С используется CStringCheeker, входящий в состав Clang Static Analyzer.

Дня моделирования с каждым строковым объектом связывается символьное значение его длины. Строковый объект может быть как самостоятельной переменной, так и полом структуры, и элементом массива. В этом отношении строковый объект однозначно идентифицируется регионом памяти, который он занимает. Таким образом, основной структурой данных является словарь, ставящий в соответствие регионам памяти строковых объектов их символьные значения длин.

Введём обозначения:

• Lw — символьное значение длины строкового объекта w;

• Argi — г-ый аргумент вызова функции или метода;

• strlen(str) — длина объекта str, который является строкой С;

• obj — объект, метод которого вызывается (неявный аргумент метода);

• Res — возвращаемое значение функции или метода,

В таблице 1 приведены правила моделирования конструкторов строк С--,

Аналогичным образом вводятся правила для операторов присваивания и метода assign(), Дополнительным требованием моделирования этих функций, в отличие от конструкторов, является моделирование возврата объекта, метод которого вызывается (return *this), Аналогичные правила действуют для функции STL std: : assign(),

Таблица 1. Правила моделирования конструкторов строк С++

Метод Правило

Конструктор но умолчанию Lobj ^ 0

Конструктор конин то\'е-конструктор Lobj < LArg1

Конструктор подстроки J Arg3, Args + Arg2 < LArgi Lobj ^ \ 1 LArgi — Arg3, иначе

Конструктор конин строки С Lobj ^ strlen(Argi)

Конструктор подстроки С 1 Arg2, Arg2 < strlen(Argi) Lobj ^ \ 1 strlen(Argi), иначе

Заполняющий конструктор Lobj ^ Argi

Метод insert О вставляет в заданную позицию в строке символы соответственно переданным аргументам. Правила моделирования перегрузок метода представлены в таблице 2, Метод возвращает ссылку на объект. Метод append О использует схожие сигнатуры перегрузок, и данные правила можно использовать дня его моделирования с уменьшением номера аргумента в правилах на 1,

В результате выполнения оператора конкатенации строк (opérâtог+) длина результирующей строки становится равной сумме длин строк-аргументов. Формально данное правило запишем правилом 8:

LRes ^ Vl + V2, (8)

Перегрузка Правило

Строка С— Lobj — Lobj + LArg2

Подстрока С-- J Arg4, Arg4 + Arg3 < LArg2 Lobj — Lobj + \ 1 LArg2 — Arg3, иначе

Строка С Lobj — Lobj + strlen(Arg2)

Подстрока С Lobj — Lobj + Arg3

Заполнение Lobj — Lobj + Arg2

iНе можете найти то, что вам нужно? Попробуйте сервис подбора литературы.

Символ Lobj —— Lobj + 1

где Vj вычисляется согласно правилу 9:

V — <

LArgj, Argj — строка С++

strlen(Argj), Argj — строка С (9)

1, Argj — символ.

Правила 8 и 9 применимы также дня моделирования оператора += с тем отличием, что Vi — длина строки-объекта вызова оператора. Оператор += возвращает ссылку на объект вызова.

Ряд методов явно устанавливает или модифицирует длину строки. Правила моделирования методов resize О, erase О (точнее, его неитераторной перегрузки), методов push_back(), swap О и clear () представлены в таблице 3,

Таблица 3. Правила моделирования простых модификаторов

Метод Правило

eraseO J Lobj — Arg2, Argi + Arg2 < Lobj Lobj — < 1 Arg^ иначе

resize() Lobj — Lobj + Argi

clear() Lobj — 0

push_back() Lobj —— Lobj + 1

swapO Lobj — LArgi, LArgi — Lobj

Неитераторная перегрузка метода erase О также возвращает ссылку на объект вызова. Функция std: : swap О имеет те же правила моделирования, что и одноимённый метод, по использует первый аргумент вместо объекта вызова.

Правила моделирования метода replace О приведены в таблице 4, В этой таблице

t Arg4, Arg4 <= strlen(Arg3)

Ltmp

strlen(Arg3), иначе.

Перегрузка Правило

Строка С— Lobj * Ltmp + LArg3

Подстрока С-- J Arg5, Arg4 + Arg5 <= LArg3 Lobj *— Ltmp + \ 1 LArg3 — Arg4, иначе

Строка С Lobj — Ltmp + strlen(Arg 3)

Подстрока С 1 Arg4, Arg4 <= strlen(Arg3) Lobj — Ltmp + \ 1 strlen(Arg3), иначе

Заполнение Lobj — Ltmp + Arg3

3. Моделирование значения индекса

Сложность в моделировании значения индекса заключается в том, что индекс нередко вычисляется на основе данных самой строки и её длины. Если методы empty О , size О и length () можно точно смоделировать, не делая предположений о содержимом строки, то методы поиска этого не позволяют. Однако и дня таких методов можно ввести некоторые ограничения на возвращаемые значения методов дня повышения точности моделирования. Разработанные правила перечислены в таблице 5.

Таблица 5. Правила моделирования методов поиска и определения длины

Метод Правило

sizeü, length() Res ^ Lobj

empty О 1 tru. e, Lobj = 0 Res ^ < ,

findü, find_first_of(), find_first_not_of() 1 Val : Val ^ Arg2 Л Val < Lobj Res ^ < 1 std::npos

rfindO, find_last_of0, find_last_not_of() i Val : Val ^ 0 Л Val ^ Arg2 Л Val < Lobj Res ^ < 1 std::npos

Данные правила моделирования методов поиска позволяют достаточно точно моделировать возвращаемое значение. Более точное моделирование уже должно учитывать возможное содержимое строки.

4. Межпроцедурный анализ

В данной работе используется межнродедурный анализ с использованием резюме вызываемой функции |10|. Данный метод подразумевает анализ функции вне контекста вызова со сбором её резюме и применением полученного резюме,

В данной работе раздел резюме функции дня моделирования длин строк представляется словарём, отображающим идентификаторы строк на их символьные значения длин. Это тот же словарь, что используется при моделировании, но на момент завершения анализа, В процессе применения резюме функции объекты строк вызывающей функции меняют значения длин на указанные в резюме. При этом, если в новом значении длины есть ссылка на исходное значение длины строки, то это значение заменяется на значение длины строки до вызова функции. Поясним сказанное на следующем примере из листинга.

void callee(std::string &RefStr) { RefStr.append("text"); ResStr.push_back('r');

>

void caller(const std::string &Param) { std::string Local = Param + "sym"; callee(Local);

В результате сбора резюме для функции callee О получается словарь, отображающий идентификатор RefStr, являющийся параметром функции, па значение её длины: RefStr ^ LRefStr + 5, где RefStr — длина строки в начале анализа функции (па момент её вызова).

На момент вызова функции callee() строка Local имеет длину LLocal = LParam + 3, При моделировании вызова значение LRefStr сопоставляется со значением LLocal. Поскольку RefStr передана но неконстантной ссылке и модифицирована, в результате вызова функции длина строки Local становится (LParam + 3) + 5 = LParam + 8.

Заключение

На основе разработанных правил был реализован дополнительный проверяющий модуль дня статического анализатора Clang Static Analyzer | IL IL | дня вида дефекта, ранее не находимого данным анализатором. Этот проверяющий модуль был опробован па исходном коде пользовательских окружений операционных систем Android и Tizón. В результате измерения времени работы было установлено замедление работы анализатора всего па 5%, что является хорошим результатом.

Дня полученных срабатываний анализатора была проведён ручная проверка. Количество срабатываний, признанных корректными, составило около 70% от их общего количества. Основными причинами ложноноложитольных срабатываний оказались отсутствие моделирования содержимого строки и неявные предусловия (например, left <= right дня координат. Это можно считать хорошим результатом. В результате проведённой работы были получены следующие результаты.

1. Разработан набор формальных правил моделирования функций и методов

стандартной библиотеки языка С--, позволяющих производить поиск дефектов

тина «обращение к элементу строки но некорректному индексу» в исходном коде программ. Ряд правил с незначительными модификациями применим и к другим языкам программирования,

2. На основе разработанных правил был реализован проверяющий модуль в статическом анализаторе Clang Static Analyzer, с возможностью межнроцедурного анализа,

3. Проведена проверка реализованного в данной работе модуля на реальном коде программ (пользовательские окружения ОС Android и Tizen, суммарный объём кодовой базы около 20 млн. строк кода). Количество срабатываний, признанных корректными, составило около 70%, что является хорошим результатом дня промышленного применения статического анализатора.

Перспективы развития предложенного подхода заключаются в разработке более общего набора правил дня моделирования классов контейнеров стандартной

библиотеки языка С--, таких как std::vector, std: :list, а также модификация

правил дня проверок программ на других языках программирования.

Список литературы

1. Working Draft, Standard for Programming Language С--, ISO/IEC X4296, 2014,

2, Сикорд, С,С, Безопасное программирование па С и С--, Второе издание, М.: ООО

«И,Д. Вильяме», 2015 г, — 496 стр.

3. STR53-CPP, Range check element access, https:// www.socurocoding.cort.org/confluonco/display/cplusplus/STR53-CPP.—Range—check—element—access (дата обращения 16,02,2016)

4, Lian Li, Cristina Cifnentos, Xathan Keynes, Practical and effective symbolic analysis for buffer overflow detection. In Proceedings of the Eighteenth ACM SIGSOFT International Symposium on Foundations of Software Engineering, FSE '10, pages 317-326, Xew York, XY, USA, 2010. ACM.

5. Ru-Gang Xu, Patrice Godefroid, Rupak Majumdar, Testing for Buffer Overflows with Length Abstraction, In Proceedings of the 2008 international symposium on Software testing and analysis, ISSTA ^08, pages 27-38, Xew York, XY, USA, 2008. ACM.

6. Xavier Allamigeon, Wenceslas Godard, Charles Hymans, Static Analysis of String Manipulations in Critical Embedded С Programs. Static Analysis: 13th International Symposium, SAS 2006, Seoul, Korea, August 29-31, 2006. Proceedings. Pages 35-51, 2006.

7. James C. King. Symbolic execution and program testing // Communications of the ACM, 1976. Да 7. Т. 19. С. 385-394

8. David Larochelle, David Evans. Statically detecting likely buffer overflow vulnerabilities. In Proceedings of the 10th conference on USEXIX Security Symposium - Volume 10, Article Xo. 14. USEXIX Association Berkeley, С A, USA, 2001.

9. Belevantsev Andrey, Malikov Oleg. Using Data Flow Analysis For Detecting Security Vulnerabilities // Труды ИСП PAH. 2006. .Л* И, стр. 83-98. 2006 г.

10. Т.Н. Романова, А.В. Сидорип, Метод резюме дня разработки универсального многоцелевого анализатора кодов программ с возможностью обнаружения различных классов дефектов в программах, созданных с использованием языков

С и С--. Вестник МГТУ им. Н.Э. Баумана, серия «Приборостроение», ,Л"а 5, 2015.

Стр. 73-93.

11. Clang Static Analyzer, http://clang-analyzer.llvm.org/ (дата обращения 17.02.2016).

Science and Education of the Bauman MSTU, 2016, no. 6, pp. 175-186.

DOI: 10.7463/0516.0840726

Date: 23.05.2016

© Bauman Moscow State Technical University

A method for searching of C+—+ string accesses with an incorrect index

Sidorin A. V.1' alexey.v.sidorin@yandex.ru

xLtd. "Samsung Moscow Research Center", Moscow, Russia

Keywords: C++, STL, static analysis, string overflow, Clang Static Analyzer

Science & Education

of the Bauman MSTU

Electronic journal

ISSN 1994-0408

Since C++ is a commonly used programming language that is also in wide use for programming the mobile OS such as Tizen the static analysis of C++ programs is in high demand. The article is devoted to searching the accesses to C++ strings with an incorrect index. As opposed to the buffer overflows in C, this kind of defect in rarely detected by industrial static analyzers due to complexity of its modeling. In the work, we formalize the criteria of this defect and propose the formal modeling rules of C++ string-related methods and a number of STL functions. These rules allow modeling of string length and access index. The rules for summary-based inter-procedural analysis are introduced as well. The article simulates only the length of a string to provide a compromise between the search precision and the volume of data processing. A checker based on these modeling rules is implemented for the Clang Static Analyzer - a symbolic execution static analyzer for C++ code. This checker was tested on the C++ code of Android OS and OS Tizen user-mode packages (totally about 20 million strings of code). The results of an eye-inspection of warnings produced by this checker prove its precision, which is appropriate for industrial static analyzer: nearly 70

References

1. Working Draft, Standard for Programming Language C++. ISO/IEC N4296, 2014.

2. Robert C. Seacord Secure Coding in C and C++, 2nd Edition. Addison-Wesley Professional, 2013. — 545 p.

3. STR53-CPP. Range check element access. https:// www.securecoding.cert.org/confluence/display/cplusplus/STR53-CPP.+Range+check+element+access (access date 16.02.2016)

4. Lian Li, Cristina Cifuentes, Nathan Keynes. Practical and effective symbolic analysis for buffer overflow detection. In Proceedings of the Eighteenth ACM SIGSOFT International Symposium on Foundations of Software Engineering, FSE '10, pages 317-326, New York, NY, USA, 2010. ACM.

5. Ru-Gang Xu, Patrice Godefroid, Rupak Majumdar. Testing for Buffer Overflows with Length Abstraction. In Proceedings of the 2008 international symposium on Software testing and analysis, ISSTA '08, pages 27-38, New York, NY, USA, 2008. ACM.

6. Xavier Allamigeon, Wenceslas Godard, Charles Hymans. Static Analysis of String Manipulations in Critical Embedded C Programs. Static Analysis: 13th International Symposium, SAS 2006, Seoul, Korea, August 29-31, 2006. Proceedings. Pages 35-51, 2006.

7. James C. King. Symbolic execution and program testing // Communications of the ACM, 1976. no. 7. vol. 19. pp. 385-394

8. David Larochelle, David Evans. Statically detecting likely buffer overflow vulnerabilities. In Proceedings of the 10th conference on USENIX Security Symposium - Volume 10, Article No. 14. USENIX Association Berkeley, CA, USA, 2001.

9. Belevantsev Andrey, Malikov Oleg. Using Data Flow Analysis For Detecting Security Vulnerabilities // Proceedings of ISP RAS. 2006. no. 11, pp. 83-98. 2006.

10. T.N. Romanova, A.V. Sidorin. Metod rezyume dlya razrabotki universalnogo mno-gotselevogo analizatora kodov programm s vozmozhnostyu obnaruzheniya razlichnyih klassov defektov v programmah, sozdannyih s ispolzovaniem yazyikov C and C++ [Summary-based interprocedural analysis method for implementation in multi-purpose static C/C++ code analyzer]. Herald of the Bauman Moscow State Technical University, Instrument Engineering, no. 5, 2015. pp. 73-93.

11. Clang Static Analyzer. http://clang-analyzer.llvm.org/ (access date 17.02.2016).

i Надоели баннеры? Вы всегда можете отключить рекламу.