網(wǎng)站上的導(dǎo)航欄怎么做網(wǎng)站站長工具
1,clang query 概述
作用:
檢查一個(gè)程序源碼的抽象語法樹,測試 AST 匹配器;
幫助檢查哪些 AST 節(jié)點(diǎn)與指定的 AST 匹配器相匹配;
2,clang-query 安裝
準(zhǔn)備:
git clone --recursive https://github.com/llvm/llvm-project.git
cd llvm-project/
git checkout llvmorg-3.5.0
cp -r ./clang ./llvm/tools/
cp -r clang-tools-extra ./llvm/tools/clang/tools/extra
mkdir build_d ../local_d
cd build_d #其絕對(duì)路徑為:/home/hipper/llvm_3_4_0_ex/browse/local_d,如下配置所用
配置:
cmake -G "Unix Makefiles" \
-DCLANG_ENABLE_STATIC_ANALYZER=1 \
-DLLVM_ENABLE_ASSERTIONS=On \
-DCMAKE_BUILD_TYPE=Debug \
-DCMAKE_INSTALL_PREFIX=/home/hipper/llvm_3_4_0_ex/browse/local_d \
-DLLVM_ENABLE_LIBCXX=1 \
-DLLVM_ENABLE_PROJECTS="all" \../llvm
編譯安裝:
make -j34
make install
cp bin/clang-query /home/hipper/llvm_3_4_0_ex/browse/local_d/bin/
3,測試運(yùn)行
待測試程序源代碼:
hello.c
?
hello.cextern int write(int, const char*, unsigned long);int main(){write(1, "Hello, ", 7);write(1, "world", 5);write(1, "!\n", 2);return 0;}
測試:
?
$ clang-query hello.c --
效果:
識(shí)別出函數(shù)調(diào)用表達(dá)式,并打印出來了
4, 更多測試
wildanimal-sim.cpp
class Plane{public:int run(int x)
{return 10*x;
}};class Animal {
public:int position;
public:Animal(int pos) : position(pos) {}// Return new positionint run(int quantity) {return position += quantity;}
};
class Cat : public Animal {
public:Cat(int pos) : Animal(pos) {}void meow() {}void destroySofa() {}bool wildMood() {return true;}int run(int quantity){return position += 2*quantity;}
};
int main() {Cat c(50); c.meow();if (c.wildMood())c.destroySofa();c.run(2);Plane pp;pp.run(3);return 0;
}
可以直接輸出 AST 的clang 命令:
clang -Xclang -ast-dump hello.c
clang -cc1 -ast-dump hello.c
clang-query? wildanimal-sim.cpp
測試如下命令:
?
clang-query> set output dump
clang-query> match recordDecl()
clang-query> match methodDecl(hasName("run"))
clang-query> match recordDecl(isSameOrDerivedFrom(hasName("Animal")))
clang-query> match recordDecl(allOf(hasMethod(methodDecl(hasName("run"))), isSameOrDerivedFrom(hasName("Animal"))))
LLVM-18:
?
clang-query> match cxxMemberCallExpr()
clang-query> match cxxMemberCallExpr(callee(memberExpr(member(hasName("run")))))
# not work。 clang-query> match cxxMemberCallExpr(callee(memberExpr(member(hasName("run")))), thisPointerType(recordDecl(isSameOrDerivedFrom(hasName("Animal")))))
LLVM-3.5
?
clang-query> match memberCallExpr()
clang-query> match memberCallExpr(callee(memberExpr(member(hasName("run")))))
clang-query> match memberCallExpr(callee(memberExpr(member(hasName("run")))), thisPointerType(recordDecl(isSameOrDerivedFrom(hasName("Animal")))))
效果