博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Clang调试deadcode思路
阅读量:5235 次
发布时间:2019-06-14

本文共 2063 字,大约阅读时间需要 6 分钟。

首先描述下我的环境:Ubuntu16.04 llvm4.0 clang4.0全部使用源码安装方式

Clang的根目录,位于llvm-src下边的tools目录下。

因为需要找到真正的开关,下边我描述下我的思路:

clang/lib/Analysis/reachableCode.cpp,存着DeadCodeScan::findDeadCode的实现,如果功能开关打开的话,那个一定存在着这个类的初始化,然后进行调用,查找初始化这个类的地方

reachableCode.cpp:683(代表reachableCode.cpp文件的第683行,以后不再进行赘述),存在以下代码:

DeadCodeScan DS(reachable, PP);

numReachable += DS.scanBackwards(block, CB);

if (numReachable == cfg->getNumBlockIDs())

      return;

这段代码属于FindUnreachableCode()函数中。查看这个函数,发现并没有明显的开关,如果你愿意的话,可以调试下,断点肯定进不了这里。

继续向上查找,发现整个clangproject中仅有一次这个函数的调用在

clang/lib/Sema/AnalysisBasedWarnings.cpp文件中的CheckUnreachable()函数中对这个函数进行了调用,这个函数中也没有可能的开关。继续向上查找,发现在该文件的2050行中存在着CheckUnreachable的调用,粘一下这个块的代码:

if (P.enableCheckUnreachable) {

    // Only check for unreachable code on non-template instantiations.

    // Different template instantiations can effectively change the control-flow

    // and it is very difficult to prove that a snippet of code in a template

    // is unreachable for all instantiations.

    bool isTemplateInstantiation = false;

    if (const FunctionDecl *Function = dyn_cast<FunctionDecl>(D))

      isTemplateInstantiation = Function->isTemplateInstantiation();

    if (!isTemplateInstantiation)

      CheckUnreachable(S, AC);

  }

这次终于找到了一个明确的开关P.enableCheckUnreachable,查看一下enableCheckUnreachable,发现了这样一段代码

clang::sema::AnalysisBasedWarnings::Policy::Policy() {

  enableCheckFallThrough = 1;

  enableCheckUnreachable = 0;

  enableThreadSafetyAnalysis = 0;

  enableConsumedAnalysis = 0;

}

这里是比较明显的,默认初始化的话,enableCheckUnreachable 0,是不会执行的,看看在执行过程中是否会有对这个值的更改,找到以下代码:

//AnalysisBasedWarnings.cpp1995

if (P.enableCheckUnreachable || P.enableThreadSafetyAnalysis ||

      P.enableConsumedAnalysis) {

    // Unreachable code analysis and thread safety require a linearized CFG.

    AC.getCFGBuildOptions().setAllAlwaysAdd();

  }

在这里下断点,进行调试,

1955 if (P.enableCheckUnreachable || P.enableThreadSafetyAnalysis ||

(gdb) p P.enableCheckUnreachable

$1 = 0

(gdb) p P.enableThreadSafetyAnalysis

$2 = 0

(gdb) p P.enableConsumedAnalysis

$3 = 0

所以,结果就比较明显了,默认情况下,这个开关是没有打开的,需要的是修改这里的源码,重新编译。

转载于:https://www.cnblogs.com/jourluohua/p/9735868.html

你可能感兴趣的文章
128 Longest Consecutive Sequence 一个无序整数数组中找到最长连续序列
查看>>
定制jackson的自定义序列化(null值的处理)
查看>>
auth模块
查看>>
javascript keycode大全
查看>>
前台freemark获取后台的值
查看>>
log4j.properties的作用
查看>>
游戏偶感
查看>>
Leetcode: Unique Binary Search Trees II
查看>>
C++ FFLIB 之FFDB: 使用 Mysql&Sqlite 实现CRUD
查看>>
Spring-hibernate整合
查看>>
c++ map
查看>>
exit和return的区别
查看>>
discuz 常用脚本格式化数据
查看>>
洛谷P2777
查看>>
PHPStorm2017设置字体与设置浏览器访问
查看>>
SQL查询总结 - wanglei
查看>>
安装cocoa pods时出现Operation not permitted - /usr/bin/xcodeproj的问题
查看>>
GIT笔记:将项目发布到码云
查看>>
JavaScript:学习笔记(7)——VAR、LET、CONST三种变量声明的区别
查看>>
JavaScript 鸭子模型
查看>>