170 похожих чатов

Может кто подскажет или пнёт в нужном направлении, кого поспрашивать.

Хочется статический call graph. В частности clang/llvm умеет, примерно вот так: clang++ -S -emit-llvm main1.cpp -o - | opt -analyze -dot-callgraph


Но во-первых дот-файлы мало интересны, граф скорей нужен для дальнейшего программного анализа (в реальном проекте его глазами смотреть невозможно из-за размера).

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

Понятно, что может быть два подхода. Или не видим указатели вообще. Или считаем, что по-указателю может быть вызвана любая возможная функция. Но не любая, а адрес которой брали в явном виде. Или совсем не любая, а у которой прототип совпадает. Т.е. окно возможностей эффективно сужается. Подобный подход используют компиляторы Hitech-C и KEIL для построения "компилированного стека" для архитектур микроконтроллеров без аппаратного стека (там рекурсии невозможны, а все возможные варианты распределения памяти стека нужно предусмотреть в момент компиляции). Далее можно пойти дальше, и искусственно ввести различающиеся прототипы для функций вызываемых по-указателю и используемых в разных, не пересекающихся задачах (что-то наподобии tag-dispatch, когда вводится лишний параметр с типом специфичным для данного использования функции/указателя). И таким образом можно уже построить реалистичные графы вызовов и с указателями.

Реализовано ли кем-либо и где-либо что-то подобное?

Как по-вашему можно такое реализовать? Просматривается, что для llvm нужно написать собственный FunctionPass в котором (когда он итерируется по скомпилированным функциям) найти все места вызовов и если там вызов функции, то всё понятно добавляем в граф, а если вызов по указателю -- то предусматриваем все возможные функции от которых брали адрес (как это понять? в llvm промежуточном коде видно, а в C++ интерфейсе непонятно) и выяснем прототип для callsite (https://stackoverflow.com/questions/14811587/how-to-get-functiontype-from-callinst-when-call-is-indirect-in-llvm) и пересечение первого и второго множества с одинаковыми прототипами и есть множество возможных функций которые здесь и сейчас будут вызваны...

1 ответов

18 просмотров
Kirill-Frolov Автор вопроса

В целом хочется получить две вещи: 1) гарантий, что не существует путей в графе между множествами функций которые не могут вызывать друг-друга (вручную заданными). В идеале неплохо бы чтоб функциям в коде просто можно было бы навешивать (ни на что не влияющие) атрибуты для того. 2) получить максимальный объём стека используемый всеми функциями во всех возможных путях графа вызова. По последнему пункту; clang кажется (есть отдельный патч...) не поддерживает -fstack-usage, но по крайней мере интересна если не точная, то хотя бы оценка порядка. В том же llvm-промежуточном коде виден порядок (размер переменных). Например наличие рекурсии сразу требует бесконечного стека. 3) как-то доказать, что рекурсии строго ограничены в глубину, но видимо никак. только вручную.

Похожие вопросы

Обсуждают сегодня

Ребят в СИ можно реализовать ООП?
Николай
33
~ 2m21s  nix shell github:nixos/nixpkgs#stack ~  stack ghc -- --version error: … while calling the 'derivationStrict' builtin at /builtin/derivation.nix:...
Rebuild your mind.
6
Добрый вечер, Пока не совсем понимаю как наладить общение между телеграм ботом и ПО для работы с сим боксом. По самому боту так понял: - Нужен некий баланс, который можно поп...
Magic
6
core\config\database\connections\default.php На всякий случай проверь всё же файл <?php return [ 'driver' => env('DB_TYPE', 'mysql'), //$database_type 'host' => env('D...
Andrey K
2
Всем доброго вечера. Разрабатываю 32 раз. приложение в Delphi. Столкнулся с тем, что стандартный  TFilestream  не работает с большим файлом > 2 ГБайт (после вызова функции see...
Vadim Gl
16
Всем привет! Имеется функция: function IsValidChar(ch: UTF8Char): Boolean; var i: Integer; ValidChars: AnsiString; begin ValidChars := 'abcdefghijklmnopqrstuvwxyzABCDE...
Евгений
44
добрый день. Подскажите, есть сайт на 1.4.7 и я хочу обновиться, особо ничего не меняя. мне выбирать версию 1.4.35 или третью ветку? и можно ли обновлять "как есть", или нужно...
Digital Cat
12
народ, плиз хелп, всю голову сломал себе уже... разве может быть так, что GetProcAddress( GetModuleHandle( "kernel32.dll" ), "SetThreadDescription" ) вернёт ненулевое значение...
Iluha Companets
12
Кто кодит под Лазарем на винде, у вас аналогично VCL переопределяются CreateWnd и CreateParams для конкретных классов контролов и все заданные флаги влияют?
А Андрей
11
У меня задача: написать брокер сообщений. Очереди и потребители. Очереди поддерживают приоритеты. Очередь отдает сообщения, только обработчикам с соответствующими характеристи...
Aleksandr Filippov
2
Карта сайта