The OpenNET Project / Index page

[ новости /+++ | форум | wiki | теги | ]

Выпуск утилиты GNU cflow 1.7

02.01.2022 14:27

После трёх лет разработки опубликован выпуск утилиты GNU cflow 1.7, предназначенной для построения наглядного графа вызовов функций в программах на языке Си, который может использоваться для упрощения изучения логики работы приложения. Граф строится только на основе анализа исходных текстов, без необходимости выполнения программы. Поддерживается генерация как прямых, так и обратных графов потоков выполнения, а также генерация списков перекрёстных ссылок для файлов с кодом.

Выпуск примечателен реализацией поддержки формата вывода "dot" ('--format=dot') для формирования результата на языке DOT для последующей визуализации в пакете Graphviz. Добавлена возможность указания нескольких стартовых функций через дублирование опций '--main', для каждой из подобных функций будет сгенерирован отдельный граф. Также добавлена опция "--target=FUNCTION" позволяющая ограничить результирующий граф только веткой, включающей определённые функции (опцию "--target" можно указывать несколько раз). В режим cflow-mode добавлены новые команды для навигации по графу: "c" - переход к вызывающей функции, "n" - переход к следующей функции на данном уровне вложенности и "p" - переход к предыдущей функции с тем же уровнем вложенности.

В новой версии также устранены две уязвимости, которые были выявлены ещё в 2019 году и приводят к повреждению памяти при обработке в cflow специально оформленных исходных текстов. Первая уязвимость (CVE-2019-16165) вызвана обращением к памяти после её освобождения (use-after-free) в коде парсера (функция reference в parser.c). Вторая уязвимость (CVE-2019-16166) связана с переполнением буфера в функции nexttoken(). По мнению разработчиков, указанные проблемы не представляют угрозы безопасности, так как ограничиваются аварийным завершением утилиты.

  1. Главная ссылка к новости (https://www.mail-archive.com/i...)
  2. OpenNews: Анализ безопасности пакета BusyBox выявил 14 несущественных уязвимостей
  3. OpenNews: Выпуск PHPStan 1.0, статического анализатора для кода на языке PHP
  4. OpenNews: Выпуск cppcheck 2.6, статического анализатора кода для языков C++ и С
  5. OpenNews: Facebook открыл код статического анализатора Mariana Trench
  6. OpenNews: Анализ влияния на производительность выбранного в системе источника времени
Лицензия: CC-BY
Тип: Программы
Короткая ссылка: https://opennet.ru/56444-cflow
Ключевые слова: cflow, gcc
При перепечатке указание ссылки на opennet.ru обязательно


Обсуждение (38) Ajax | 1 уровень | Линейный | +/- | Раскрыть всё | RSS
  • 1.1, Аноним (1), 14:40, 02/01/2022 [ответить] [﹢﹢﹢] [ · · · ]  
  • +3 +/
    Как-то давно разбирал старый легаси код без доков, без тестов, без вменяемых гит коммитов и пришлось файлик для graphivz писать руками. Занятная была кодархеология.  
     
     
  • 2.2, Аноним (2), 14:43, 02/01/2022 [^] [^^] [^^^] [ответить]  
  • –20 +/
    Старый легаси - это когда без вменяемых cvs коммитов.
    А у вас просто говнокод.
     
     
  • 3.10, Аноним (10), 15:36, 02/01/2022 [^] [^^] [^^^] [ответить]  
  • +2 +/
    Что уж мелочится старый легаси — это перфокарта где текст коммита написан на самой карточке)
     
  • 2.21, trdm (ok), 22:16, 02/01/2022 [^] [^^] [^^^] [ответить]  
  • –3 +/
    Да и обычный проект разрастается иногда бывает.
    Нужная вещь. Плохо нет собранной под форточки.
     
     
  • 3.31, Роман (??), 10:56, 03/01/2022 [^] [^^] [^^^] [ответить]  
  • –2 +/
    WSL спасёт же. Или даже просто докер.
     
     
  • 4.33, Аноним (33), 11:44, 03/01/2022 [^] [^^] [^^^] [ответить]  
  • +1 +/
    Что только не сделают лишь бы не компилировать на целевой платформе.  
     
  • 3.36, Аноним (-), 13:49, 03/01/2022 [^] [^^] [^^^] [ответить]  
  • +2 +/
    >Плохо нет собранной под форточки

    И такие ничтожества ещё гуляют по опеннету.

     

  • 1.3, Аноним (3), 14:51, 02/01/2022 [ответить] [﹢﹢﹢] [ · · · ]  
  • –1 +/
    >По мнению разработчиков, указанные проблемы не представляют угрозы безопасности, так как ограничиваются аварийным завершением утилиты.

    Так они убрали проблему или просто отмазались?

     
     
  • 2.17, Аноним (17), 17:16, 02/01/2022 [^] [^^] [^^^] [ответить]  
  • +/
    Аварийное завершение программы это и есть срабатывание защиты безопасности.
     
     
  • 3.24, Аноним (24), 23:33, 02/01/2022 [^] [^^] [^^^] [ответить]  
  • +/
    Не всегда, ой не всегда.
     

  • 1.4, lockywolf (ok), 14:59, 02/01/2022 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    》》Граф строится только на основе анализа исходных текстов, без необходимости выполнения программы.

    А если в рантайме адрес кода, введённого с консоли, получить, да скастовать его к указателю на функцию, и запустить, он поймёт, что к чему?

     
     
  • 2.6, Crazy Alex (ok), 15:19, 02/01/2022 [^] [^^] [^^^] [ответить]  
  • +5 +/
    Софт (обычно) пишут чтобы на практике использовать, а не вы...ваться. Работает для "нормального" кода, разумеется, а извращенцы пусть мучаются.
     
     
  • 3.18, Аноним (-), 19:01, 02/01/2022 [^] [^^] [^^^] [ответить]  
  • –1 +/
    Вообще-то в старину такой софт назывался "монитором" и не служил вы...нам. Чисто прагматическая конструкция.
     
     
  • 4.37, Аноним (-), 13:50, 03/01/2022 Скрыто модератором
  • –1 +/
     
  • 2.11, Аноним (10), 15:39, 02/01/2022 [^] [^^] [^^^] [ответить]  
  • +/
    Нет. Но если ты решил сам себя обмануть, то это ты сам себе злобный Буратино.  
     
  • 2.12, OpenEcho (?), 15:53, 02/01/2022 [^] [^^] [^^^] [ответить]  
  • +7 +/
    > адрес кода, введённого с консоли

    Вы б послали кого нибудь за закуской что ли, праздники все таки

     
  • 2.13, Аноним (13), 16:02, 02/01/2022 [^] [^^] [^^^] [ответить]  
  • +/
    Вот из-за таких постов люди и боятся goto.
     
  • 2.15, Dzen Python (ok), 16:27, 02/01/2022 [^] [^^] [^^^] [ответить]  
  • –1 +/
    Выдыхай, бобёр, выдыхай
     
  • 2.16, Аноним (16), 17:10, 02/01/2022 [^] [^^] [^^^] [ответить]  
  • +/
    Это работает только у тех юзверюшек, что разрешают исполнять writable memory.
     
     
  • 3.19, Аноним84701 (ok), 20:32, 02/01/2022 [^] [^^] [^^^] [ответить]  
  • +/
    > Это работает только у тех юзверюшек, что разрешают исполнять writable memory.

    Pro-tip: перед тем как пользоваться уничижительными эпитетами, убедитесь в достаточном знании предмета:



    #include <stdio.h>
    #include <stdlib.h>
    int main(int argc, char** argv) {
        int (*some_func)(char*) = (int (*) (char*)) atol(argv[1]);
        return (*some_func)("0");
    }
    ...
    # fcall.c:4:     int (*some_func)(char*) = (int (*) (char*)) atol(argv[1]);
            mov     rdi, QWORD PTR [rsi+8]  # MEM[(char * *)argv_3(D) + 8B], MEM[(char * *)a>
            call    atol    #
    # fcall.c:5:     return (*some_func)("0");
            mov     edi, OFFSET FLAT:.LC0   #,
            call    rax     # tmp91



     
     
  • 4.20, uis (ok), 21:31, 02/01/2022 [^] [^^] [^^^] [ответить]  
  • +/
    И? Привет Page Fault и прилетит SIGSEGV
     
     
  • 5.22, Аноним84701 (ok), 22:29, 02/01/2022 [^] [^^] [^^^] [ответить]  
  • +/
    > И? Привет Page Fault и прилетит SIGSEGV

    И каким боком оно к "исполнять writeable memory"?
    А так: просто вводите правильный адрес, например от atoi или strlen. Делов-то.
    Бонус: при вводе еще более 'правильного' адреса можно получить классический ROP/return-to-libc, против которого W^X/NX не защищает от слова "никак". Для этого придумали ASLR.


     
     
  • 6.27, Аноним (27), 03:02, 03/01/2022 [^] [^^] [^^^] [ответить]  
  • +/
    Ну, чтобы не было ROP, нужно адреса для функций определять заранее, а не брать откуда попало. Указатели на функции - это удобный способ избавиться от огроменных if-else. Так же, как и printf по сути.
     
  • 4.23, Аноним (24), 23:27, 02/01/2022 [^] [^^] [^^^] [ответить]  
  • +/
    И что это говнокод 80 лвл? Зачем такое в реальном проекте. А если эту тулзу решил обмануть то есть более простой путь. Вообще не использовать эту тулзу!
     
     
  • 5.25, Аноним (-), 00:13, 03/01/2022 [^] [^^] [^^^] [ответить]  
  • +/
    > И что это говнокод 80 лвл? Зачем такое в реальном проекте. А
    > если эту тулзу решил обмануть то есть более простой путь. Вообще
    > не использовать эту тулзу!

    Можно попробовать что-то сравнимое для колбэков :). А оно просекает регистрацию колбэков по указателю?

     
  • 5.29, Аноним84701 (ok), 05:59, 03/01/2022 [^] [^^] [^^^] [ответить]  
  • +1 +/
    > И что это говнокод 80 лвл?

    Демонстрирует в 2 строках, что никакой "исполнять writable memory" там и рядом не лежал?

    > Зачем такое в реальном проекте.

    Опять кто-то анонимный слишком поторопился с эпитетами?
    man atexit
    https://git.musl-libc.org/cgit/musl/tree/src/exit/atexit.c#n26



    void __funcs_on_exit()
    {
    void (*func)(void *), *arg;
    LOCK(lock);
    for (; head; head=head->next, slot=COUNT) while(slot-->0) {
    func = head->f[slot];
    arg = head->a[slot];
    UNLOCK(lock);
    func(arg);
    LOCK(lock);
    }
    }


    Как впрочем и любая библиотека, предоставляющая внешние колбэки (GTKшные сигналы-слоты, куда в рантайме пачками, "извне", прилетают адреса кода, совсем не через libastral работает) и через одну -- программы с интерфейсом для подгружаемых раширений.

     
     
  • 6.38, Аноним (33), 17:13, 03/01/2022 [^] [^^] [^^^] [ответить]  
  • +/
    Вопрос всё тот же зачем тебе лезть в визуализацию расширений. Но ты все равно непроходимый.  
     
     
  • 7.39, Аноним84701 (ok), 17:32, 03/01/2022 [^] [^^] [^^^] [ответить]  
  • +/
    >> > Это работает только у тех юзверюшек, что разрешают исполнять writable memory
    >> демонстрация, как оно на самом деле работает
    > И что это говнокод 80 лвл?

    ...
    > Вопрос всё тот же зачем тебе лезть в визуализацию расширений.

    Никаких вопросов не было бы, если бы ты умел читать. Ну или хотя бы не пытался усиленно и уныло сменить тему или перейти на личности ...
    > Но ты все равно непроходимый.

    "Отмазывайся теперь!" (с) Ordu

     
     
  • 8.42, Аноним (42), 13:39, 04/01/2022 [^] [^^] [^^^] [ответить]  
  • +/
    Да ты просто делаешь хорошую мину при плохой игре ... текст свёрнут, показать
     

  • 1.5, MazikOttogi (ok), 14:59, 02/01/2022 [ответить] [﹢﹢﹢] [ · · · ]  
  • +1 +/
    В своё время регулярными выражениями создавал копию исходников с printf\cout в начале и завершении функций, при помощи этого табулируя результирующий строчный вывод)
    Имхо, выходит нагляднее теоретической графсхемы.
     
     
  • 2.34, Андрей (??), 13:24, 03/01/2022 [^] [^^] [^^^] [ответить]  
  • +/
    а можно просто gcc -pg и записывать uftrace
     

  • 1.28, Аноним (28), 04:47, 03/01/2022 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    А для этого нужно иметь исходники, а что там с бинарями, а под разные платформы? Уже что-то есть позволяющее хоть какое-то представление получить ?
     
     
  • 2.30, Вован (??), 10:48, 03/01/2022 [^] [^^] [^^^] [ответить]  
  • +1 +/
    Посмотрите rizin / cutter, утилиты для RE, недавно наткнулся
     
  • 2.32, Аноним (33), 11:40, 03/01/2022 [^] [^^] [^^^] [ответить]  
  • +/
    Ничего кроме IDA Pro принципиально не юзабельно для этой задачи.  
     
     
  • 3.40, Аноним (40), 02:06, 04/01/2022 [^] [^^] [^^^] [ответить]  
  • +/
    А Ghidra?
     
     
  • 4.41, Аноним (42), 13:38, 04/01/2022 [^] [^^] [^^^] [ответить]  
  • +/
    А что у гидры уже появился отладчик? Спойлер: Нет.

    Да даже если посмотреть что выдает гидра на обычных 64 битных бинарниках. Ида как минимум популярные компиляторы выдает очень хорошо.  

    Единственные известный минус Иды это то что она очень платная. А Гидра это для каких-нибудь редких архитектур типа PIC-24 ну и для халявщиков тоже.  

     

  • 1.35, Gogi (??), 13:29, 03/01/2022 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    Зная про DEFINE в Си, их парсер должен быть прямо хорошим компилером, чтобы корректно всё отображать!

    По поводу dot... так-то оно работает, но это <b>примитивный</b> язык графов (и только). Чтобы вывести там что-то красивое (например, FK-связи между таблицами СУБД), придётся прямо в язык вносить HTML-элементы(!!!). Иначе сами таблицы не построить. У меня в программе это используется, но радости от этого неуклюжего решения я не испытываю. Что радует, dot снимает с меня заботу о размещении узлов, но нередко получаются довольно уродские графы, где сразу несколько стрелок сливаются в одну теплотрассу, а потом конечно же расходятся, подмигивая "угадай, где-кто?". Пипец...

     
  • 1.44, burjui (ok), 02:57, 08/01/2022 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    А вот если бы эту утилиту делали опеннетчики, не было бы ни переполнения буфера, не use after free, потому что эксперты. Ну, или если бы её делали на другом ЯП, который здесь ненавидят до изжоги.
     

     Добавить комментарий
    Имя:
    E-Mail:
    Текст:



    Спонсоры:
    PostgresPro
    Inferno Solutions
    Hosting by Hoster.ru
    Хостинг:

    Закладки на сайте
    Проследить за страницей
    Created 1996-2022 by Maxim Chirkov
    Добавить, Поддержать, Вебмастеру