Мы провели глобальный точечный анализ (с косвенными указателями на функции) и построение полного графа вызовов из монолитных систем C из 26 миллионов строк (18 000 единиц компиляции).
Мы сделали это, используя DMS Software Reengineering Toolkit , его C Front End и соответствующее оборудование для анализа потока .Механизм анализа точек (и другие анализы) является консервативным;да, вы получаете несколько фиктивных точек и, следовательно, вызываете ребра.Это довольно трудно избежать.Вы можете помочь таким анализаторам, предоставив некоторые важные факты о ключевых функциях и используя знания, такие как «встроенные системы [и ОС], как правило, не имеющие циклов в графе вызовов», что означает, что вы можете устранить некоторые из них.Конечно, вы должны учитывать исключения;моя мораль: «в больших системах все происходит».
Особая проблема заключалась в динамически загружаемых (!) модулях C, использующих специальную схему загрузки, специфичную для этого конкретного программного обеспечения, но это только добавило проблемы.*
Приведение к указателям на функции не должно терять ребер;консервативный анализ должен просто предполагать, что указатель приведения соответствует любой функции в системе с сигнатурой, соответствующей приведенному результату.Более проблемными являются отливки, которые производят совместимые подписи;если вы приведете указатель функции к void * foo (uint), когда фактическая вызываемая функция принимает int, точки анализа обязательно будут консервативно выбирать неправильные функции.Вы не можете обвинить анализатор в этом;актерский состав лежит в этом случае.Да, мы видели этот вид мусора в системе из 26 миллионов строк.
Это, безусловно, правильная шкала для анализа Linux (я думаю, что это просто 8 миллионов строк или около того :-).Но мы не пробовали это специально для Linux.
Настройка этого инструмента сложна, потому что вам нужно собрать всю информацию о самих компиляциях и, в частности, о конфигурации ядра Linux, которую вы хотите сгенерировать.Таким образом, вам нужно перехватить вызовы компилятора, чтобы получить ключи командной строки и т. Д.