# cmg **Repository Path**: jiayi0118/cmg ## Basic Information - **Project Name**: cmg - **Description**: 使用clang/llvm提取c/c++软件中的文件粒度的依赖关系,包括对头文件的包含依赖关系和源文件间的全局符号使用关系。 - **Primary Language**: C/C++ - **License**: MPL-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 1 - **Created**: 2021-09-25 - **Last Updated**: 2023-04-24 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # Cpp Model Graph (CMG) ## 工作目标 整合clang/llvm编译前后端的程序分析技术,提取c++程序的文件特征以及符号依赖关系。 ## 部署环境 系统环境: ```shell $ uname -a Linux plus 5.4.0-88-generic #99~20.04.1-Ubuntu SMP Thu Sep 23 17:29:00 UTC 2021 x86_64 x86_64 x86_64 GNU/Linux ``` ## 安装依赖: ```shell sudo apt install git cmake python3 llvm-11 llvm-11-dev clang-11 libclang-11-dev nlohmann-json3-dev mysql-server libmysqlclient-dev libmysql++-dev pip intall PyMySQL (conda install PyMySQL) ``` ## 编译安装 ```shell cd cmg mkdir build ; cd build cmake .. -DCMAKE_C_COMPILER=clang-11 -DCMAKE_CXX_COMPILER=clang++-11 make sudo make install ``` ## 测试 ```shell cd test/simple-test ; mkdir build ; cd build cmake .. && make cmg-ffe -p . ../main.c ``` ## CmgDudePass执行指令 ### clang ```shell clang -O1 -Xclang -load -Xclang libCmgDudePass.so *.c/*.cpp ``` ### opt new PM ```shell opt -load-pass-plugin libCmgDudePass.so -passes="CmgDudePass" -disable-output <.s/.ll/.bc> ``` ### opt legacy PM ```shell opt -load libCmgDudePass.so -LegacyCmgDudePass -disable-output <.s/.ll/.bc> ``` ## 文件特征提取 ### 数据结构 #### class FileFeature 文件特征类,包含一个私有数据成员:map featureMap。 #### struct Feature 特征类,包含所需统计的特征。 ### 具体处理 #### 见RecursiveASTVisitor.cpp ## 依赖图构造 首先创建数据库,比如创建数据库cmg,用户名为plus,访问地址为localhost,用户密码为1,端口为3306,根据数据库配置修改mysql_config.def文件,之后执行**重新编译程序**,并运行脚本。 ```c++ #define HOST "localhost" #define USER "plus" #define PASSWORD "1" #define DATABASE "cmg" #define PORT 3306 ``` ```shell cd scripts ; ./bash_dependency_extract.sh ```