clang 开发入门: 检查 if 语句的过度嵌套

采用 ninja 构建

检查

brew list | grep ^ninja

安装

brew install ninja


重复过程

  • 产生代码

cd /Users/jzd/Movies/A_B/llvm-projectX

cmake -S llvm -B build -G Ninja -DLLVM_ENABLE_PROJECTS="clang;libcxx;libcxxabi"

  • 项目编译

cd /Users/jzd/Movies/A_B/llvm-projectX/build

ninja clang

➜ build git:(main) ninja clang

[3345/3345] Creating executable symlink bin/clang


/Users/jzd/Movies/A_B/llvm-projectX/clang/lib/Sema/SemaStmt.cpp

里面

StmtResult Sema::ActOnIfStmt(SourceLocation IfLoc, bool IsConstexpr,
                             SourceLocation LParenLoc, Stmt *InitStmt,
                             ConditionResult Cond, SourceLocation RParenLoc,
                             Stmt *thenStmt, SourceLocation ElseLoc,
                             Stmt *elseStmt) {

//...


llvm:: dbgs() << "处于 ActOnIfStmt, 发现了 if 条件判断 \n";
    CondExpr->dump();

  return BuildIfStmt(IfLoc, IsConstexpr, LParenLoc, InitStmt, Cond, RParenLoc,
                     thenStmt, ElseLoc, elseStmt);
}

效果一:

  • 查看例子

➜ build git:(main) ✗ cat /Users/jzd/Movies/A_a/Clang/proj/collect/999998/999998/test.cpp

代码很简单

void test(int a, int b){
    if (a > 0 && b > 0){
        
    }
}
  • 命令

➜ build git:(main) ✗ /Users/jzd/Movies/A_B/llvm-projectX/build/bin/clang -c /Users/jzd/Movies/A_a/Clang/proj/collect/999998/999998/test.cpp

dump 到的信息

处于 ActOnIfStmt, 发现了 if 条件判断 
BinaryOperator 0x7fe8e9075ea0 '_Bool' '&&'
|-BinaryOperator 0x7fe8e9075e08 '_Bool' '>'
| |-ImplicitCastExpr 0x7fe8e9075df0 'int' <LValueToRValue>
| | `-DeclRefExpr 0x7fe8e9075db0 'int' lvalue ParmVar 0x7fe8e9075b68 'a' 'int'
| `-IntegerLiteral 0x7fe8e9075dd0 'int' 0
`-BinaryOperator 0x7fe8e9075e80 '_Bool' '>'
  |-ImplicitCastExpr 0x7fe8e9075e68 'int' <LValueToRValue>
  | `-DeclRefExpr 0x7fe8e9075e28 'int' lvalue ParmVar 0x7fe8e9075be8 'b' 'int'
  `-IntegerLiteral 0x7fe8e9075e48 'int' 0
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值