Разобраться в новом коде

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

После непродолжительного поиска я нашел несколько скриптов, которые рисуют такой граф. На вопрос в твиттере мне подсказали ещё несколько вариантов: doxygen и скрипт graph-llvm-ir для LLVM IR.

Все найденные варианты работают примерно одинаково: строят синтаксическое дерево и на его основе рисуют картинку с графом. При ближайшем рассмотрении выяснилось, что код pycflow2dot давно не обновлялся и не работает с последними версиями питоновских модулей. codeviz тоже давно не обновлялся и у меня не получилось его попробовать. А вот Doxygen оказался очень простым в использовании. Нужно выполнить команду doxygen -g, которая создаст шаблон конфига, потом включить в этом конфиге опции HAVE_DOT, EXTRACT_ALL, EXTRACT_PRIVATE, EXTRACT_STATIC, CALL_GRAPH и запустить doxygen Doxyfile в директории с исходниками. После успешного выполнения программа создаст две директории: latex и html. В первой будут исходники для сборки pdf документа, а во второй документация для просмотра в браузере. Для теста я запускал doxygen в репозитории проекта CRIU (~67 KLOC) и создание документации заняло 4 минуты. Для каждого исходного файла создается отдельный раздел с документации и там можно посмотреть и описания функций, если они аннотированы в коде, и графы взаимосвязей функций. Пользоваться удобно.

01.06.2018

Практикум для изучения ОС

Я решил систематизировать свои знания об устройстве операционных систем и читаю всякие книжки по этой теме. На отсутствие теории не могу жаловаться. А вот с практической стороной у меня сложилось не сразу. Чаще всего советуют для изучения ОС взять исходники Minix или одну из первых версий. Но у Minix очень большая кодовая база, а ядро Линукс это всё-таки еще не операционная система.

Для меня более подходящим полигоном для изучения и экспериментирования стал проект учебной ОС xv6. Это Unix-подобная ОС, которую используют в учебных целях в MIT и других университетах. Запустить её просто - нужно собрать загрузочный образ и загрузить с ним виртуальную машину:

$ make
$ make qemu

Набор пользовательских утилит сильно ограничен, но, например, можно посмотреть список файлов и запустить регресионные тесты:

Помимо исходного кода для xv6 доступен учебник с описанием её устройства.

Ещё один проект, который мне был полезен, это юнит-тесты для KVM. Каждый юнит-тест это простая программа на ассемблере, проверяет “железо”: наличие ACPI таблиц, возможность выделить память, порты ввода-вывода и т.д.

23.02.2018

Карточки Людвига

Когда Студия Артемия Лебедева занялась картой Московского метро, то я читал рассказы арт-директора этого проекта о том, как они делают эту карту. Людвиг пишет интересно и мне нравилось его читать. Недавно зашел на его сайт, который он постоянно переделывает, и мне понравились его Карточки. Я подписался на них по РСС и rss2email прислал мне в почту все девяносто семь записей. Пришлось читать.

Карточки состоят из понравившихся в книгах цитат, а часть - его собственные размышления и наблюдения. Ссылки на самые интересные карточки я привел ниже.

Рецензия на книгу Прохорова “Русская модель управления” - Факторы успеха русской модели управления.

Об экспериментальном подходе Пастера

Два поста про Любищева и его систему: Любищев о своей системе, Краткая справка о системе А.А. Любищева. Если коротко, то Любищев был советским учёным, который научился очень точно планировать своё время и за счёт этого многое успел сделать за свою карьеру. Я про него читал книгу “Эта странная жизнь”, но книжка показалась скучной. Если интересно узнать подробнее, то эти два поста могут быть хорошим введением.

Про ошибки внимания в Атомная подводная лодка против траулера, или Как работает иллюзия внимания. В Японии для борьбы с халатностью и невнимательностью была разработана система “pointing and calling”. Главная идея этой системы заключается в том, что человек в укрепляет умственное действие физическим жестом и голосовым сигналом. Например, машинисту мало посмотреть на зелёный свет, перед тем, как тронуть состав. Он должен указать на светофор, и громко сказать “Зелёный свет, можно ехать”. Таким образом не только он сам более внимательно относится к своим действиям, но и все окружающие видят, что он не забыл проверить важный индикатор, или выполнить пункт техники безопасности.

Кратко о сути психоанализа Фрейда

Токсоплазма — бесстрашный кошачий пассажир. Так я узнал что такое токсоплазма и чем она опасна.

Описание способа организации поездок, который позволит беречь “мыслетопливо” - Спокоен, как авиапассажир.

О смысле жизни невыдающегося математика

Если вы хотя бы раз в жизни пытались завести у себя какую-то привычку, то знаете насколько это иногда бывает сложно сделать. В тяжелых случаях Людвиг советует капнуть маслица.

Об ограниченной эффективности советов

„Буря в пустыне“. Неожиданная стратегия из учебника.

21.12.2017

Универсальный фаззер для грамматик

Этот текст - продолжение поста про фаззинг. Его я закончил на том, что было бы здорово на основе грамматики генерировать примеры для тестирования приложений. Нужно сразу отметить, что эта идея не нова и есть специализированные фаззеры, которые генерируют синтаксически правильные программы. Немного расскажу про три таких фаззера.

Пожалуй самый известный пример это csmith. Фаззер генерирует синтаксически правильную программу на языке Си и с помощью тестируемого компилятора пытаются эту программу скомпилировать. С помощью csmith нашли семь десятков багов в gcc и пару сотен в LLVM.

Второй пример это sqlsmith. Принцип точно такой же как и у csmith, список багов тоже не маленький - семь десятков.

sqlsmith и csmith имеют одну общую черту - генератор для каждого из них писали отдельно. Писать свой генератор для синтаксиса каждого из демонов OpenBSD мне совсем не хотелось. К тому же синтаксис мог со временем меняться и генератор пришлось бы исправлять.

Ещё один пример это фаззер для CockroachDB. Эта СУБД имеет нестандартную реализацию SQL, поэтому sqlsmith им не подошёл. Грамматика SQL для CockroachDB описывается в формате YACC и они на основе этой грамматики сделали генератор SQL запросов и нашли с ним 82 бага. Из-за того, что генератор использует YACC формат он опять же не является универсальным для разных грамматик.

В OpenBSD для описания грамматики конфигов тоже используется YACC, на основе которого с помощью утилиты yacc генерируется парсер. Пример описания для yacc выглядит так:

%{
#include <stdio.h>
#include <string.h>
 
void yyerror(const char *str)
{
        fprintf(stderr,"error: %s\n",str);
}
 
int yywrap()
{
        return 1;
} 
  
main()
{
        yyparse();
} 

%}

%token NUMBER TOKHEAT STATE TOKTARGET TOKTEMPERATURE

Мне нужно было YACC-описание преобразовать в более стандартный и читаемый формат, желательно независимый от языков программирования. Таким форматом является BNF - форма Бэкуса-Наура. BNF используется для описания синтаксиса языков программирования, протоколов и т.д. Вот так, например, выглядит описание небольшой части синтаксиса конфига пакетного фильтра в OpenBSD:

line    = ( option | pf-rule | 
          antispoof-rule | queue-rule | anchor-rule | 
          anchor-close | load-anchor | table-rule | include ) 
 
option  = "set" ( [ "timeout" ( timeout | "{" timeout-list "}" ) ] | 
          [ "ruleset-optimization" [ "none" | "basic" | 
          "profile" ] ] | 
          [ "optimization" [ "default" | "normal" | "high-latency" | 
          "satellite" | "aggressive" | "conservative" ] ] 
          [ "limit" ( limit-item | "{" limit-list "}" ) ] | 
          [ "loginterface" ( interface-name | "none" ) ] | 
          [ "block-policy" ( "drop" | "return" ) ] | 
          [ "state-policy" ( "if-bound" | "floating" ) ] 
          [ "state-defaults" state-opts ] 
          [ "fingerprints" filename ] | 
          [ "skip on" ifspec ] | 
          [ "debug" ( "emerg" | "alert" | "crit" | "err" | 
          "warning" | "notice" | "info" | "debug" ) ] | 
          [ "reassemble" ( "yes" | "no" ) [ "no-df" ] ] ) 

yacc не может преобразовать YACC-описание напрямую в BNF форму, но с ключом -v можно преобразовать в описание, удобное для чтения, а потом сделав небольшие преобразования получить описание в EBNF, расширенной BNF форме. EBNF это как раз то, что мне и было нужно. Для чтения EBNF во многих языках есть модули и сделать генератор не будет большой проблемой.

Приятный бонус использования EBNF это возможность нарисовать railroad диаграммы для грамматики:



Насколько эффективным получился мой генератор напишу в одном из следующих постов.

Если тема показалась интересной, то вот список статей на подобную тематику:

18.12.2017

Наблюдение о блоггинге

За время ведения этого блога у меня появилось одно наблюдение.

Когда есть идея для нового поста, то это ещё недостаточное условие для его написания. Потому что вдобавок к идее нужно найти материал, придумать как подать текст, продумать структуру и т.д. Если такую подготовительную работу не сделать, то написание может превратиться в мучение - вроде хочется написать, но текст не идёт. Если же всё предварительно продумать, то написание текста пройдет легко. Я для себя взял за правило основательно готовиться перед тем как сесть писать новый текст и назвал его Правило Толстого. Потому что он это сформулировал задолго до меня:

«Когда вам хочется писать — удерживайте себя всеми силами, не садитесь сей­час же. Советую вам это по личному опыту. Только тогда, когда невмоготу уже терпеть, когда вы, что называется, готовы лопнуть, — садитесь и пишите. Наверное, напишете что-нибудь хорошее».

14.12.2017

Чтение PDF

Многие из книг по тестированию и верификации ПО доступны бесплатно в формате PDF. Но PDF читать неудобно: экран смартфона слишком маленький для него, на компьютере экран нормальный, но я не готов портить зрение чтением на нём сотен страниц текста. Авторы этих книг продают эти книги в бумажном варианте и я был бы готов их купить, если бы не сумасшедшие цены - от $100 USD и выше.

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

10.12.2017

Инфостиль c Language Tool

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

После того, как я закончил курс Главреда, я стал чаще использовать сайт glavred.ru для измерения градуса инфостиля в своих текстах. Но при частом использовании надоедает копипаст текста для проверки. Наверное я был не один такой, кому это показалось рутинным занятием и для проверки текста сделали API и теперь сервис интегрируется в разные приложения.

До того, как в сервис добавили API мне пришла в голову идея сделать правила проверки инфостиля для Language Tool. Я тогда спросил Ильяхова не планирует ли он сам их сделать и он ответил что нет. С тех пор я своего времени я пока не нашел, чтобы сделать их самому, но вдруг кому-то из подписчиков эта идея понравится. И если вы оказались таким человеком, то следующие ссылки для вас.

Для Language Tool есть руководство и интерактивный редактор правил, которые должны облегчить их написание.

Есть списки слов, которые не рекомендуется использовать в текстах в информационном стиле: от фронтендера из Яндекса и список от ребят, которые сделали сервис, похожий на Главред.

03.12.2017