首先描述下我的环境: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()函数中。查看这个函数,发现并没有明显的开关,如果你愿意的话,可以调试下,断点肯定进不了这里。

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

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.cpp:1995

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

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

Clang调试deadcode思路的更多相关文章

  1. Clang调试CUDA代码

    Clang调试CUDA代码全过程 有空再进行编辑,最近有点忙,抱歉 使用的llvm4.0+Clang4.0的版本,依据的是上次发的llvm4.0和clang4.0源码安装的教程https://www. ...

  2. 解决Android加固多进程ptrace反调试的思路整理

    本文博客链接:http://blog.csdn.net/qq1084283172/article/details/53613481 一.Android多进程反调试的原理代码 当ptrace附加目标进程 ...

  3. GDB调试总结__1

    该博客旨在分享IT技术心得和实际工作中遇到问题的解决方法,下面是新浪博客地址http://blog.sina.com.cn/qianyumolu,则为分享经济.行业趋势.心灵文章等,有兴趣的朋友能够踩 ...

  4. CentOS 6.9开启iptables的日志实现调试

    系统日志配置在CentOS 5上叫syslog,而在CentOS 6上叫rsyslog(增强版的syslog),CentOS 5上的配置文件在/etc/syslog.conf下,而CentOS 6在/ ...

  5. Win7 x86内核调试与TP反调试的研究

    参考  这两天对某P双机调试的学习及成果 ,非常好的一篇分析贴. 本文在Win7 x86下的分析,在虚拟机中以/DEBUG模式启动TP游戏,系统会自动重启. 0x01 内核调试全局变量  根据软件调试 ...

  6. VS编译器优化诱发一个的Bug

    VS编译器优化诱发一个的Bug Bug的背景 我正在把某个C++下的驱动程序移植到C下,前几天发生了一个比较诡异的问题. 驱动程序有一个bug,但是这个bug只能 Win32 Release 版本下的 ...

  7. 胡扯两句——CDQ分治

    之前听大神讲过CDQ分治大概是个什么东西,但是一直还没有真正去搞过.今天稍微看了一下,写点自己的理解. 首先CDQ分治有两个条件. 条件1:可以分成两个独立互不影响的问题(这里的"独立&qu ...

  8. iBatis入手案例

    第一部分,iBatis组织架构分析 1.1 组织架构图 1.2 架构分析 DAO层上面,DAO类通过SqlMapConfig文件,来构建iBatis提供的SqlMapClient,SqlMapConf ...

  9. 编程策略类note

    2016-1-15 LOG LOG最重要的作用即是为程序出bug时调试提供思路, 一个自定义的log,需要有几个要素: 1. 时间,以知道哪些log是我们所需要的, 2. 标签,判断哪些log是属于哪 ...

随机推荐

  1. LC 833. Find And Replace in String

    To some string S, we will perform some replacement operations that replace groups of letters with ne ...

  2. 代码实现:键盘录入一个int类型的整数,对其求二进制表现形式

    package com.loaderman.test; import java.math.BigDecimal; import java.math.BigInteger; import java.ut ...

  3. AngularJS unit test report / coverage report

    参考来源: http://www.cnblogs.com/vipyoumay/p/5331787.html 这篇是学习基于Angularjs的nodejs平台的单元测试报告和覆盖率报告.用到的都是现有 ...

  4. 红米note4高配版 电量用完,充不进去电,解决办法

    红米note4高配版  电量用完,充不进去电,解决办法 1.拆机,电池连线拆开,再安上,反复两次.就ok. 2.尾插坏了,买个尾插,换上.就好. 修手机的一次1,2百,太贵

  5. 利用Bag中的getCount()方法统计list集合中重复元素

    实际应用场景:从Excel导入数据时,存在某个标识符相同的多条数据,需要进行合并,因此需要统计重复元素,可以利用Bag包下的getCount()进行统计,代码如下: package test.com. ...

  6. 在使用DapperExtensions时遇到"其他信息: ConnectionString 属性尚未初始化。"错误

    今天在使用在使用DapperExtensions时遇到"其他信息: ConnectionString 属性尚未初始化."错误. //return conn.GetList<T ...

  7. svn修改代码URL整合路径

    我们平常开发的代码都是在A服务器上整合的,最近A服务器突然无法访问了,所以今天我们更换了一下服务器.svn如何安装的就不说了,这里只介绍一下如何更换SVN URL的. 在你拿到URL后,在工作文件夹下 ...

  8. Web Components的概念和用法

    参考链接:https://developer.mozilla.org/zh-CN/docs/Web/Web_Components

  9. [转帖]2018年的新闻: 国内首家!腾讯主导Apache Hadoop新版本发布

    国内首家!腾讯主导Apache Hadoop新版本发布   https://blog.csdn.net/weixin_34194317/article/details/88811258 腾讯也挖了很多 ...

  10. C++多线程基础学习笔记(七)

    一.std::async和std::future的用法 std::async是一个函数模板,std::future是一个类模板 #include <iostream> #include & ...