I am developing a static analysis tool with python-clang-3.6 library that would let me to draw function call-graphs.
To properly create TranslationUnit I need to use corresponding compile command (i.e. clang.cindex.Index.parse(c_file, compile_command) ). However, I believe, to be able to properly interconnect TranslationUnits I would also need to use linker commands to know which TranslationUnit uses functions from other TranslationUnits. This is a problem in my project where there are actually multiple binaries being built with a single "make" invocation and some TranslationUnits might possibly have colliding symbol names, so I can't assume that all of them are inter-connected.
What is the best way to address this issue so that my tool would know which functions in C file could call functions from other C files?
For now I see two options:
- Somehow retrieve and use linker commands; This option seems tricky because it is not directly supported in
clang(at least clang python library); or - At the time when traversing
TranslationUnit's AST tree remember the location of function declaration in the Header file. This option seems tricky if due to macro processing I would get different line numbers or have implicit function declarations for differentTranslationUnits.
Are there any other options? Which option and why would chose you?