Opracowuję narzędzie analizy statycznej z biblioteką python-clang-3.6
, które pozwoli mi rysować wywołania funkcji.użycie komend linera do analizy statycznej klang
Aby poprawnie utworzyć TranslationUnit
, należy użyć odpowiedniego polecenia kompilacji (tj. clang.cindex.Index.parse(c_file, compile_command)
). Wierzę jednak, że aby móc poprawnie łączyć TranslationUnits
, potrzebowałbym również użyć poleceń linkera, aby wiedzieć, który TranslationUnit
wykorzystuje funkcje z innych . Jest to problem w moim projekcie, w którym faktycznie powstaje wiele plików binarnych z pojedynczą inwokacją "make", a niektóre z nich mogą mieć kolidujące nazwy symboli, więc nie mogę założyć, że wszystkie są ze sobą powiązane.
Jaki jest najlepszy sposób rozwiązania tego problemu, aby moje narzędzie wiedziałoby, które funkcje w pliku C mogłyby wywoływać funkcje z innych plików C?
Na razie widzę dwie opcje:
- jakoś odtworzyć i użyć polecenia łączącą; Ta opcja wydaje się trudna, ponieważ nie jest obsługiwana bezpośrednio w
clang
(przynajmniej biblioteka python clang); lub - W czasie, gdy przechodzenie przez drzewo AST
TranslationUnit
pamięta położenie deklaracji funkcji w pliku nagłówka. Ta opcja wydaje się trudna, jeśli z powodu przetwarzania makr dostanę różne numery linii lub domyślne deklaracje funkcji dla różnychTranslationUnits
.
Czy są jeszcze jakieś opcje? Którą opcję i dlaczego wybrałeś?