电影旅行敲代码

编译优化 工具链 代码分析 C++
私信 关注
电影旅行敲代码
码龄9年

http://www.movietravelcode.com/

  • 205,904
    被访问量
  • 96
    原创文章
  • 25,606
    作者排名
  • 301
    粉丝数量
  • 毕业院校 电子科技大学
  • 目前就职 bytedance
  • 于 2012-03-12 加入CSDN
获得成就
  • 获得131次点赞
  • 内容获得106次评论
  • 获得159次收藏
荣誉勋章
兴趣领域
  • #后端
    #Linux#C/C++
TA的专栏
  • 读书笔记
    10篇
  • 视频笔记
  • Programming Language Theory
    3篇
  • LeetCode
  • 论文笔记
    1篇
  • 书评
  • 编译
    25篇
  • c++基础
    26篇
  • 计算机杂想
    8篇
  • LLVM源码系列
    16篇
  • 数据结构
    4篇
  • SICP
    2篇
  • 乡村骑士随笔
    6篇
  • golang
    4篇
  • 最近
  • 文章
  • 资源
  • 问答
  • 课程
  • 帖子
  • 收藏
  • 关注/订阅

编译工具链相关招聘帖

字节跳动系统部-基础库与编译工具链研发实习生 (此贴长久有效)职责描述C/C++编译工具链维护,包括gcc/llvm,debugger,linker以及其它binutils工具参与公司软硬件协同优化方案的创新与落地公司内部基础库研发维护,包括glibc/libstdc++/libstdc++以及第三方基础库工作要求了解编译器原理,对工具链有一定的技术热情具备编译优化能力有性能优化经验者优先,例如Perf/Vtune/EMON等性能优化工具对计算体系结构与Linux内核有一定了解参与
原创
53阅读
0评论
0点赞
发布博客于 2 月前

GCC源码阅读缩写速查

缩写缩写说明AVAIL_OUTThe AVAIL_OUT set, which represents which values are available in a given basic block.ANTIC_INThe ANTIC_IN set, which represents which values are anticipatable in a given basic block.GCSEGlobal common subexpression elimin
原创
124阅读
0评论
0点赞
发布博客于 7 月前

工作三年半记

我的技术路线我的跳槽我从章磊,赵扶摇,李崇哲,丁孟为身上学到的从leader张伟身上学到的从蛙总身上学到的从梁广泰身上学到的我自己的职业经历从我女朋友,从蒋队身上学到的覃超 - 新人在公司打游戏思路前期闷头刷兵,不要浪,不要骚,把安排的任务做好就可以了。 中期打团战 后期抗伤害,主力输出。摒弃学生思维Proactive 主动...
原创
108阅读
4评论
1点赞
发布博客于 8 天前

记一次gcc -O2大幅度增加binary size的问题

为什么-O2选项会增加binary的大小,是不是开启的inline flags引起,什么是function-level linking
原创
316阅读
2评论
0点赞
发布博客于 9 月前

GCC中的COW(Copy On Write)

文章目录什么是COWCopy Elision实现可能实现libstdc++的实现有什么问题COW与C++11有什么关系呢如何触发libstdc++分配内存时的bookkeeping information待总结In the GCC 5.1 release libstdc++ introduced a new library ABI that includes new implementatio...
原创
405阅读
0评论
0点赞
发布博客于 1 年前

go module & package & versioning & vendor 笔记

个人总结,无参考价值Go ModuleGo设计之初的GOPATH机制可以说比较失败,所以后面才有了vendor和module来修补,module解决核心的问题是version问题,也就是包管理问题。module的整个设计可以参考Russ Cox的博客Go & Versioning。普通用户只需要使用就行了,不需要考虑module背后设计哲学。go.modgo module使用go....
原创
217阅读
0评论
0点赞
发布博客于 1 年前

浅谈 language server & LSIF & SARIF & Babelfish & Semantic & Tree-sitter & Kythe & Glean等

注:本人做过静态代码分析,也算是做过code intelligence,两者互有交叉,所以这里将涉及到的有意思的东西记录下来,未来有精力再依次对这些项目进行介绍文章目录什么是language server protocolJSONRPCLSIF(Language Server Index Format)SARIF(Static Analysis Results Interchange Forma...
原创
997阅读
0评论
1点赞
发布博客于 2 年前

如何给llvm添加一个pass

在PLCT之前必须完成
原创
450阅读
0评论
0点赞
发布博客于 2 年前

clang static analyzer总结

总结注:有一段时间没有接触csa,很多东西发生了变化,但本质的东西没有大的变动,这里再回顾一下。这里不会介绍太细节的东西,搞技术搞的太细节了,会导致自己“过拟合”,从而缺少接受其他知识的泛化的能力。我在这里罗列这些东西,对于他人没有什么特别有价值的东西,我能读到的源码,别人也能读到,我能看到的论文,别人也能看到。这些内容唯一的价值是帮助我理思路从源代码到程序真正运行下面几个阶段都可以做代码分...
原创
1148阅读
0评论
0点赞
发布博客于 2 年前

#64 Abstract Interpretation: Introduction & #66 Galois Connections - 课程笔记

业余民科,阅读笔记,拾人牙慧前置知识Operational semanticsTAPLOpertional semantics specifies the behavior of a programming language by defining a simple abstract machine for it. This machine is “abstract” in the se...
原创
258阅读
0评论
0点赞
发布博客于 2 年前

Python深度学习:基于TensorFlow - 第9章 TensorFlow基础 阅读笔记

这一章首先介绍了TensorFlow的整体架构图,给出一个大体的认识。We designed TensorFlow for large-scale distributed training and inference, but it is also flexible enough to support experimentation with new machine learning mode...
原创
114阅读
0评论
0点赞
发布博客于 2 年前

Python深度学习 - 基于TensorFlow:线性代数阅读笔记

垃圾内容,勿读想要了解线性代数本质,请翻墙看3Blue1Brown的视频3Blue1Brown 线性代数本质这一系列的章节安排如下图所示:Linear transformations and matrices这个视频首先介绍了线性变换的几个要点,然后以视频的形式介绍一个二阶矩阵如何在二维坐标系中承担起转换的角色。Linear transformation有两个属性需要保持:all...
原创
170阅读
0评论
0点赞
发布博客于 2 年前

调试LLVM如何生成SSA

SSA
原创
1070阅读
1评论
3点赞
发布博客于 2 年前

论文 A Linear Time Algorithm for Placing phi-Nodes:阅读笔记

介绍这个论文提出了一种简单高效率的插入ϕ\phiϕ-node的方法。论文指出了传统插入ϕ\phiϕ-node算法的一些弊端。注:这个论文还有一些前置论文,我懒得看了想要解决的问题论文想要解决的是在计算dominance frontier时候潜在的O(N2)O(N^2)O(N2)的复杂度。论文指出计算ϕ\phiϕ-node插入位置可以在线性时间内完成,核心就在于处理dominator tre...
原创
258阅读
0评论
0点赞
发布博客于 2 年前

再谈Dominator Tree的计算

文章目录Vertex-removal AlgorithmThe Iterative Algorithm RevisitDistributive Data-Flow FrameworkLengauer-Tarjan Algorithm Revisit具体实现DFS计算semidominatorseval & link计算idomidomidomThe SEMI-NCA Algorithm论文...
原创
503阅读
1评论
0点赞
发布博客于 2 年前

Python深度学习 基于Tensorflow: Theano基础 读书笔记

未来补充逻辑回归实例拟合函数f(x)=11+ex∗w−bf(x) = \frac{1}{1 + e^{x * w - b}}f(x)=1+ex∗w−b1​代价函数xent(w,b)=−y∗log(f(x))−(1−y)∗log(1−f(x))xent(w, b) = -y * log(f(x)) - (1 - y) * log(1 - f(x))xent(w,b)=−y∗log(f(x)...
原创
154阅读
0评论
0点赞
发布博客于 2 年前

深度学习的数学:深度学习和卷积神经网络 读书笔记

BP神经网络的问题https://www.cnblogs.com/subconscious/p/5058741.html神经网络与拓扑摘抄于Neural Networks, Manifolds, and Topology,用于记录。针对神经网络想要解决的问题,我们可以把神经网络看做线性可分的问题,https://zhuanlan.zhihu.com/p/22888385http://c...
原创
77阅读
0评论
0点赞
发布博客于 2 年前

构造SSA

业余民科,拾人牙慧,垃圾内容勿看在文章《SSA的优势》以接近于无的实操经验总结了SSA的优势。在文章《构造Dominator Tree以及Dominator Frontier》介绍了如何构造Dominator Tree和Dominator Frontier,为放置ϕ\phiϕ指令做准备。这篇文章介绍如何构造SSA的形式。构造DomTree这里我们就使用《Engineering a Com...
原创
862阅读
0评论
1点赞
发布博客于 2 年前

深度学习的数学:反向传播算法

业余民科学习者阅读笔记,垃圾内容代价函数最小值回顾在《深度学习的数学:神经网络的数学基础 - 阅读笔记》中提到了,如果要求模型的参数Arg0, Arg1, ..., ArgnArg_0,\ Arg_1,\ ...,\ Arg_nArg0​, Arg1​, ..., Argn​。给定一组打了标签的数据<input1, t...
原创
73阅读
0评论
0点赞
发布博客于 2 年前

std::variant visitor与pattern matching

业余民科,拾人牙慧,垃圾内容std::variant我在《CppCon 2016: Ben Deane “Using Types Effectively" 笔记》中提到了Ben认为std::variant和std::optional是C++最重要的新特性。但是在笔记中,我只提到了std::variant是type-safe的union,与ML或者Haskell中pattern matching...
原创
157阅读
0评论
0点赞
发布博客于 2 年前

CppCon 2016: Ben Deane “Using Types Effectively" 笔记

与视频内容重复std::optional && std::variantoptionalstd::optional是由A proposal to add a utility class to represent optional objects提出来的?里面详细介绍了std::optional的设计以及背后的原因。cppreference里面详细介绍了std::option...
原创
55阅读
0评论
0点赞
发布博客于 2 年前

Programming Language, Part C - 第一周上课笔记

OOP的核心PLP - Dynamic Method Bindingdynamic dispatchdynamic dispatch vs closures如何使用racket模拟dynamic dispatch读书的重点在于思考和理解,否则无疑是向脑子里倾倒垃圾...
原创
117阅读
0评论
0点赞
发布博客于 2 年前

Engineering a Compiler: 5.1/5.2 Graphical IRs

业余民科学习者阅读笔记,垃圾内容在《PLP: 4.2/4.3 Attribute Gramma阅读笔记3》中提到AST在整个编译过程中并不是必须的,同理IR也并不是必须的(AST本来就是IR的一种)。源码被compiler部分模块处理后得到IR,IR以另外一种形式保存了源码的内容,有时可能需要symbol table或者其它数据结构辅助。IR作为抽象出来的一个layer,主要目的是进行targe...
原创
119阅读
0评论
0点赞
发布博客于 2 年前

深度学习的数学:神经网络的数学基础 - 阅读笔记

业余民科学习者阅读笔记,垃圾内容simoid函数早期神经网络使用sigmoidsigmoidsigmoid函数作为神经元的激活函数,它有如下的形式。σ(x)=11+e−x\sigma(x)=\frac{1}{1+e^{-x}}σ(x)=1+e−x1​现在我还没有足够的知识理解为什么使用sigmoidsigmoidsigmoid函数作为神经网络的激活函数,大家众说纷纭,没有足够有说服力的答案...
原创
195阅读
0评论
1点赞
发布博客于 2 年前

PLP: 4.2/4.3 Attribute Gramma阅读笔记3

构造AST在compiler中是否是一个必不可少的步骤? 由于attribute grammar和one-pass compiler或者说语法制导翻译(syntax-directed translation,SDT)联系很紧密,所以attribute grammar和这个问题有存在间接的的关系。答案是否,构造AST并不是一个必要的步骤(可以思考构造AST的目的是什么),甚至在计算机资源极其有限的...
原创
104阅读
0评论
0点赞
发布博客于 2 年前

untyped lambda calculus

(阅读笔记,低质,请直接翻看引用)最近在看TAPL,遇到了lambda-calculus,这算是我第一次系统性的学习这个概念。然后就像了解到信息论和图灵机一样,跪倒在地。按照自己不记录一下就没有学透彻的惯例,记录一下学习心得。lambda 相关约定t::=termsxvariableλx.tabstractiont tapplicationt ::= \qquad \qquad \...
原创
243阅读
0评论
0点赞
发布博客于 2 年前

structural induction

最近在看programming languges theory相关的书,遇到了structural induction这个概念,记录一下。在介绍structural induction之前,先介绍一个在自然数上应用数学归纳法的例子。定义一个集合 SSS。1 ∈S\in S∈S3×t+2∈S3 \times t + 2 \in S3×t+2∈S,其中 t∈St \in St∈S其它自然数都...
原创
208阅读
0评论
1点赞
发布博客于 2 年前

Some Thoughts

自己的经历书籍书籍时间自私的基因2013年暗时间2013年数学之美2013年人类不平等的起源2013年进化心理学2014年枪炮病菌与钢铁2014年自私的基因进化心理学枪炮病菌与钢铁暗时间数学之美枢纽剧鸿观圆桌派马爷 道理不是学来的,是通过经历然后自己反思得到的。一千零一夜晓说概率的世界罗辑思维天道...
原创
536阅读
3评论
1点赞
发布博客于 2 年前

gopls中一死锁问题记录

死锁表象client端在发完initialize请求后,gopls调用initialize对应的handler,初始化成功。但是client端在发下一个请求时,gopls就"卡"死了,client端发出去了请求,但是gopls却显示没有收到。而gopls端CPU资源和内存资源占用极低。调用lsof -i:port(其实从这里就能看出来是gopls创建了两个监听同一端口的goroutine导致的...
原创
1911阅读
0评论
0点赞
发布博客于 2 年前

深度调试gopls(过时,低质量-How-自用)

什么是LSPLSP(Language Server Protocol)是微软在开发visual studio code中针对Language Server设计的一种协议,关于设计中的抉择,在文章《Language Server Extension Guide》有详细介绍。下面我粘贴了这篇文章中的一些描述,采用Language Server的原因主要分为如下三点:不同语言的language ...
原创
2439阅读
0评论
0点赞
发布博客于 2 年前

调试gopls(tools/lsp)及部分源码剖析笔记(过时,低质量,自用)

goplsgopls是go官方给出的go-langserver的一个外部接口,核心是x/tools/internal/lsp,所以调试gopls可以说就是调试go lsp。调试query使用delve进行调试,调试命令如下。前半段是调试go-pls的调试命令,后面跟的是gopls执行时的参数,下面的命令就是要查询internal/lsp/cmd/definition.go偏移1277的位置定...
原创
4291阅读
3评论
1点赞
发布博客于 2 年前

莫居以名

这篇文章(请先无视这个狗屁不通的题目)最早可以追溯到两年前QQ空间中的一条说说,源于一些自己的遭遇和身份的错位。后来读到《自私的基因》,《进化心理学》和《枪炮,病菌,钢铁》这些书,用其中的内容来解释现实生活看似不合理的现象,多多少少解释了自己心中的困惑,让我知道某些失败有其外部原因,而无需过分自责。当然这些内容或许不是真理,但由于与我的世界观相容,能够解释得通社会中的某些现象来帮助自己解开心结,...
原创
663阅读
2评论
2点赞
发布博客于 3 年前

SICP Section 1.1

SICP 1.1节的标题是《The Elements of Programming》,分为如下几个小节,重点在于加粗的内容。ExpressionsNaming and the EnvironmentEvaluating CombinationsCompound ProceduresThe Substitution Model for Procedure ApplicationCond...
原创
124阅读
0评论
0点赞
发布博客于 3 年前

介绍《SICP读书笔记》

对SICP - 《Structure and Interpretation of Computer Programs》早有耳闻,但是总认为此书老旧,没有学习的价值,现在回想起来自己很是幼稚。每个人在知识面前应该保持足够的谦卑,此书评价这么高说明其中的内容定有学习的价值。回想刘未鹏在自己的博客中曾经提到基于比较的排序与信息论之间存在关系时,发现高德纳前辈在其《计算机程序设计的艺术》一书中早就云淡风轻...
原创
426阅读
0评论
0点赞
发布博客于 3 年前

CppCon 2018: Jason Turner “Applied Best Practices”总结一 :why noexcept?

什么是noexcept在CppCon 2018上,Jason Turner在talk《Applied Best Practices》中提出总结了几点best practices,我会通过几篇文章做一些笔记,本文章对c++11中noexcept进行一些总结。noexcept specifiernoexcept specifier: Specifies whether a function c...
原创
252阅读
0评论
0点赞
发布博客于 3 年前

CppCon 2018: Jason Turner “Applied Best Practices”总结一 :why noexcept?

什么是noexcept在CppCon 2018上,Jason Turner在talk《Applied Best Practices》中提出总结了几点best practices,我会通过几篇文章做一些笔记,本文章对c++11中noexcept进行一些总结。noexcept specifiernoexcept specifier: Specifies whether a function c...
原创
252阅读
0评论
0点赞
发布博客于 3 年前

RMQ(Range minimum query) based LCA solution

何为RMQ解法1Sparse TableRMQ为什么能够解决LCA问题RMQ与Tarjan的区别ToDo: PAT(Patricia Tree)、Suffix-Tree
原创
195阅读
0评论
0点赞
发布博客于 3 年前

电影旅行敲代码的To Do List

题目 说明 完成 Clang Fuzzer 否 LLVM Fuzzer 否 CodeChecker论文笔记 http://gsd.web.elte.hu/papers/2018/codecompass-industry_icpc_2018.pdf 否 Steensgaard’s pointer analysis ...
原创
788阅读
0评论
1点赞
发布博客于 2 年前

工作一周年记

为了避免丧失时间感,工作与生活的过于浑浑噩噩,决定每半年写一篇总结与反思。从2017/6/30毕业工作到现在差不多一整年的时间,初入职场,存在很多问题但也收获了很多,通过该文章稍作总结。这一年无论是技术还是想法层面,感觉自己并没有太多的变化,像大多初入职场的员工一样,一种平淡的提高。一. 获得这一年的收获分为两个层面,一是技术层面,一是想法方面。1.1 技术技术方面,从2016年开...
原创
856阅读
7评论
6点赞
发布博客于 3 年前

Tarjan's strongly connected components algorithm的一些想法

深度优先遍历Tarjan的极大强连通子图(strongly connected components)算法基于深度优先遍历(DFS)实现。例如对于下图来说,深度优先遍历是最直观的方法,例如我们从A开始遍历,如果能够回到A,那么整个路径就是一个连通分量。例如下图中的A -&amp;amp;amp;amp;amp;gt; B -&amp;amp;amp;amp;amp;gt; E就是一个连通子图,但不是极大连通子图。所以我们需要将路径A -&amp;amp;amp;amp;amp;g
原创
1551阅读
0评论
2点赞
发布博客于 3 年前

llvm中的数据结构及内存分配策略 - DenseMap

DenseMap数据结构子篇DenseMap是在llvm中用的非常广泛的数据结构,它本身的实现是一个基于Quadratic probing(二次探查)的散列表,键值对本身是std::pair&amp;amp;amp;amp;amp;amp;amp;amp;amp;lt;KeyT, ValueT&amp;amp;amp;amp;amp;amp;amp;amp;amp;gt;。DenseMap&amp;amp;amp;amp;amp;amp;amp;amp;amp;lt;&a
原创
2354阅读
1评论
1点赞
发布博客于 3 年前

提交patch以及代码review中常用术语

提交patch以及代码review中常用术语LGTM  —  looks good to meACK  —  acknowledgement, i.e. agreed/accepted changeNACK/NAK — negative acknowledgement, i.e. disagree with change and/or conceptRFC  —  request fo...
原创
664阅读
0评论
1点赞
发布博客于 3 年前

clang static analyzer中的数据结构及内存分配策略 - ImmutableMap & ImmutableSet篇

clang static analyzer中使用到的数据结构注:这篇博客的初衷来源于[Analyzer] Attempting to speed up static analysis clang static analyzer中使用到的数据结构大致有以下几种,ImmutableMap,ImmutableSet,FoldingSetNode,SmallVector,StringRef以及Arr...
原创
701阅读
0评论
1点赞
发布博客于 3 年前

__builtin_addressof

__builtin_addressof__builtin_addressof是由Richard Smith提交到clang中的,提交的patch为Add a __builtin_addressof that performs the same functionality as the built-in,commit message如下:Add a __builtin_addressof...
原创
872阅读
2评论
0点赞
发布博客于 3 年前

llvm:: IntrusiveRefCntPtr

boost::intrusive_ptr在介绍llvm::IntrusiveRefCntPtr之前,先介绍intrusive_ptr的概念,intrusive_ptr也是智能指针的一种,同样避免内存泄漏的安全问题,并且intrusive_ptr也是基于RAII实现的。但intrusive_ptr与shared_ptr也有一些不同,最本质不同就是计数器存放的位置。对于std::shared_pt...
原创
360阅读
0评论
0点赞
发布博客于 3 年前

llvm::ArrayRef和llvm::StringRef

llvm中的一个bug工作中遇到了一个关于关于llvm::ArrayRef和std::vector的内存bug,这个bug涉及到llvm::ArrayRef的实现以及相关的概念,这里做相关介绍。该bug由[Bash-autocompletion] Add support for static analyzer flags引入,引起的bug见Revert r311552: [Bash-autocomp
原创
1365阅读
0评论
1点赞
发布博客于 3 年前

自定义类型使用range-based for loops

Range based for loops(范围for循环)在https://reviews.llvm.org/D42300#inline-369356 中被提建议使用range based for loop,但是在我印象中range based for loop只被用在了c++11容器中,当时还在想有些鸡肋,就没有往下深究。但是range based for loop确实可以被用在用户自定义
原创
856阅读
0评论
0点赞
发布博客于 3 年前

Anderson's pointer analysis

指针分析 指针分析是一类特殊的数据流问题,它是其它静态程序分析的基础,但指针使用的灵活性导致了指针分析的复杂性,实际上指针分析是一个不可判定问题,所以实际的指针分析算法都是近似且保守的,须在效率和精度之间进行折衷。 指针分析研究的内容主要集中在分析精度和时空开销之间的取舍,精度方面,主要指流敏感性(flow-sensitivity)和上下文敏感性(context-sensitivity
原创
2269阅读
0评论
2点赞
发布博客于 4 年前

Tarjan’s off-line lowest common ancestors algorithm

Tarjan's LCA算法
原创
646阅读
0评论
1点赞
发布博客于 4 年前

数据流分析中的Distributive Dataflow Problems

Distributive Data flow Problems一个数据流问题包括如下几部分:CFG数据流值的值域初始的数据流值交汇运算(用于将前驱或者后继节点的值进行“交汇”)传输函数 而Distributive Data flow(可分配数据流问题)问题就是关于交汇运算和传输函数的问题,可分配数据流问题有如下等式:也就是传输函数trans在交汇运算U上是可分配的。判断数据流问题是否可
原创
662阅读
3评论
0点赞
发布博客于 4 年前

clang static analyzer源码分析(番外篇):removeDead() - SVal、Symbol及Environment

引子在《clang static analyzer源码分析(番外篇):RegionStore以及evalCall()中的conservativeEvalCall》中,我们介绍了RegionStore以及cluster analysis,里面我们提到除了invalidate regions会使用到cluster analysis外,remove dead也需要cluster analysis。除此之外
原创
1948阅读
0评论
0点赞
发布博客于 5 年前

clang中的活跃性分析(续)

clang中活跃性分析续,这篇文章介绍了LiveVariables和RelaxedLiveVariables的区别,并给出了相关示例
原创
1608阅读
0评论
4点赞
发布博客于 5 年前

clang static analyzer源码分析(番外篇):RegionStore以及evalCall()中的conservativeEvalCall

介绍clang static analyzer对于RegionStore的实现,以及对函数inline时的conservativeEvalCall机制进行分析
原创
2454阅读
3评论
1点赞
发布博客于 5 年前

clang static analyzer源码分析(番外篇):evalCall()中的inline机制

引子我们在clang static analyzer源码分析(一)中介绍到,path-sensitive analysis的两种形式,一种是inline形式的分析,一种是非inline形式的分析。在静态分析的过程中,函数是否inline,属于过程间分析(interprocedural analysis)讨论的概念。对于两种形式来说,各有优劣,但基本上来说函数inline形式的分析得到的结果更为准确。
原创
2807阅读
0评论
2点赞
发布博客于 5 年前

clang static analyzer源码分析(五)

引子上一篇文章我们介绍了CFG,path-sensitive analysis就是在CFG上进行的,今天这篇文章主要介绍clang static analyzer的内存模型,相关的有 MemRegion以及MemRegion等相关的类。—————————更新————————– 关于clang static analyzer-memory model的设计思想可以阅读《A Memory Model
原创
3521阅读
0评论
2点赞
发布博客于 5 年前

clang static analyzer源码分析(四)

引子在上一篇文章中,非常粗略的过了一遍clang static analyzer相关源码的头文件,这篇文章简要介绍下clang static analyzer中的与CFG相关的类。clang static analyzer中的CFG是AST层级的,也就是CFG的CFGElement还是AST树中的结点,CFG只是在AST上套了一层图结构。这一点在CFG类的注释信息中能够明确看出来。CFGElemen
原创
3414阅读
0评论
1点赞
发布博客于 5 年前

clang static analyzer源码分析(三)

引子在clang static analyzer源码分析(二)中我们简要介绍了ExplodedGraph以及如何调试clang static analyzer。今天这篇文章重点分析一下clang static analyzer对于path-sentitive analysis的代码架构。path-sensitive analysis的源码架构clang static analyzer关于path-s
原创
3716阅读
0评论
3点赞
发布博客于 5 年前

clang static analyzer源码分析(二)

clang static analyzer源码分析(二),主要介绍ExplodedGraph的概念以及对clang static analyzer进行调试
原创
4897阅读
10评论
3点赞
发布博客于 5 年前

inline - performance

引言函数内联(inline)算是C/C++很重要的语言特性,对于函数体比较小的函数来说 inline 可以说是一种比较重要的优化了。inline 在函数调用处(Call Site)使用函数体进行替换, inline 和 macro 很相似,但是又有一些不同,inline expansion 是在编译期间进行的,而 macro expansion 是在预处理阶段完成的。在编译期间可以获得类型等信息可以
原创
671阅读
0评论
0点赞
发布博客于 5 年前

构造Dominator Tree以及Dominator Frontier

支配树(Dominator Tree)在生成SSA的时候,需要计算在何处插入正确的 Φ (phi-function) ,一种方法是在所有有多个前驱的Basic Block的开头插入 Φ-node,但是这种方法会插入很多的无用的 Φ-node ,有很多 Φ-node 的参数都是相同的一个定义。 The Φ-function is the most important SSA concept to
原创
6049阅读
2评论
8点赞
发布博客于 5 年前

SSA的优势

由来前一段时间阿里云OS 编译器岗位内推面试,面试官问了SSA的优势,我答的很简洁,面试官后来对我说没有答好。所以索性就做一次知识的搬运工,收集一些资料。传统数据流分析(Data-flow analysis)劣势前面的提到过传统的数据流分析是 Dense 的分析,就是在分析过程中,要携带当前所有的分析信息经过每一个程序点,即使很多信息与当前程序点没有任何关系。(1)R大的解释 正是因为SSA形式
原创
3493阅读
0评论
2点赞
发布博客于 5 年前

迭代数据流分析中的逆后序(Reverse Postorder)

—————————————-更新———————————-Eli Bendersky大神的博客有关于数据流分析各种ordering的分析,大神的 分析深入浅出,大家请移步Eli Bendersky’s website。当然也可以继续看下面的文章—————————————-更新———————————-迭代数据流分析中的三个要素点在使用迭代算法进行数据流分析的时候,需要考虑三个方面的问题。Termina
原创
3096阅读
0评论
0点赞
发布博客于 5 年前

gdb调试Clang2.6 (clang-cc)

文章介绍了如何通过源码编译Clang2.6并如何进行调试
原创
3784阅读
4评论
0点赞
发布博客于 5 年前

2016年上半年总结

前记最近半年一直在准备实习的事情,所以落下了博客,Clang static analyzer源码分析开了坑,但是却没有填上,在此表示歉意。总的来说,上半年的实习找的一塌糊涂,我从去年就已经决定要找编译方面的工作,可惜编译相关的职位,不是很多,自己又能力不济,所以屡次碰壁。如何走上编译的道路走上编译的道路,还是得从本科说起,本科对计算机体系结构和编译原理非常感兴趣,保研时就直接联系了编译原理老师,进入
原创
1265阅读
4评论
2点赞
发布博客于 5 年前

C++11中的 "enable_if"小记

std::enable_if
原创
16284阅读
1评论
7点赞
发布博客于 5 年前

编程领域中的 "transparent" 和 "opaque"

引言在学习计算机的过程中,经常会接触到 “透明” 和 “非透明” 的概念。刚开始理解 “透明” 这个概念的时候,认为 “透明” 就是程序员可以看见其中的构造,但是老师却说透明是程序员意识不到其中的存在,所以对这个概念一直都有些困惑。后面接触到 “不透明” 这个概念的时候,意味着程序员看不到其中的机理。所以对 “transparent” 和 “opaque” 一直很迷惑。其实两个确实是有不同的,重点就
原创
6271阅读
2评论
3点赞
发布博客于 5 年前

人类面对问题时的盲目

引子最近在准备工作的事情,所以花了一小部分的时间去回顾算法,在回顾算法的时候感觉其实都是在 背算法 ,这就类似于编译器中的符号表或者一个哈希表,将问题场景和算法一一对应起来。人们面对问题时下意识的从不会去进行思考,找到问题的最优解或者是较优解,而是撸开袖子开干。这个现象在每个人身上都会发生,为什么会这样呢?虽然这样做往往是盲目的。人是进化过来的动物其实可以从进化论的角度来解释这个问题,因为在远古社会
原创
637阅读
0评论
1点赞
发布博客于 5 年前

B+ Tree vs B Trees

引子最近一直回顾自己曾经写的一些文档,有一篇是关于 Clang Rewriter 的源码分析文档,其中用到了 B+ 树来组织整个代码改写结果。Clang Rewriter 是用于代码改写主要的接口,例如源码级别的代码插桩就要用到 Rewriter 接口,源码修改会带来很多随机的增删,肯定不可能直接在源码字串上增删代码,这样子串频繁移动的开销太大,所以Clang就使用B+树来组织整个过程。由于B+树的
原创
2741阅读
0评论
1点赞
发布博客于 5 年前

AOT JIT and Interpretation

在接触虚拟机的时候,首先遇到的三个概念就是AOT、JIT 和 Interpretation,那么这三个概念有什么区别呢?AOTAhead-of-time(AOT) 是一种编译方式,现在常见的高级语言都会采用这种方式,例如C/C++代码以及Java中间代码,它们都可以在程序执行前编译成可执行完文件。这里的 time 就是 runtime,例如编译C/C++代码到ELF或者PE格式的可执行文件然后运行。
原创
911阅读
0评论
1点赞
发布博客于 5 年前

clang static analyzer源码分析(一)

引子clang静态代码分析是clang相对于gcc一个比较能够引起关注的点,特别是clang静态代码分析基于checker的架构和大部分的静态分析工具都不相同。clang静态代码分析使用符号执行的技术执行路径敏感的代码分析,符号执行引擎并不实际进行报错,而是使用挂载在引擎上的checker对程序状态进行检查并报错。这种方式方便用户对代码检查规则或者bug类型进行扩展,但是这种架构也有其缺陷,符号执行
原创
13041阅读
26评论
9点赞
发布博客于 5 年前

数据流分析的局限性

引子前面我们介绍了很多关于数据流分析的知识,虽然说数据流分析是整个代码分析基础中的基础,但是数据流分析还是存在很大的局限性,一部分局限性来自于数据流分析所做的假设(例如假设所有路径可达),一部分局限性来自于分析语言的性质(例如C++语言中的异常处理或多态)。为了作出可靠的决定,所以编译器设计者必须了解数据流分析能做什么以及它不能做什么。 Nodes are required to hold in
原创
1831阅读
0评论
1点赞
发布博客于 5 年前

数据流分析(三)

引子在数据流分析(一)和数据流分析(二)中我们介绍了数据流分析的基本模式以及到达定值和活变量的分析。在这篇文章中我们简要介绍一下可用表达式和数据流分析中的格。可用表达式数据流分析中的格可用表达式 如果从流图入口结点到达程序点 p 的每条路径都对表达式 x + y 求值,且从最后一个这样的求值之后到p点的路径上没有再次对x或y赋值,那么 x + y 在 p 点上可用(available)。
原创
5366阅读
2评论
1点赞
发布博客于 5 年前

Name Mangling

引子为了在链接的时候能够让链接器唯一标识全局变量或者函数等的符号,编译器实现了一种name mangling的技术(也叫做name decoration),这个技术能够给所有目标文件中的符号一个唯一的名字。具体的实现方式就是编译器向函数,结构体,类或者其他的数据类型的对象名中附加上相应的类型信息,然后这个信息供链接器使用来实现链接过程中的符号决议。由于很多语言都允许对象同名,这些同名的对象或者处于不
原创
2080阅读
0评论
0点赞
发布博客于 5 年前

clang中的活跃性分析

引子clang和LLVM都实现了活跃性分析,只是两者的目的不同,一个用于后续静态代码分析,一个用于后续的代码生成以及代码优化。clang活跃性分析实现主要在LiveVariables.h和LiveVariables.cpp这两个文件中,和常见的活跃性分析不同,clang的活跃性分析主要用于clang static analyzer,在静态代码分析的过程中删除死的状态和符号值。 There’s a
原创
2347阅读
0评论
1点赞
发布博客于 5 年前

数据流分析(二)

引子我们在数据流分析(一)中简要介绍了数据流分析的基本概念,下面我们集中分析一些数据流分析的实例来阐述数据流分析的核心思想。到达定值活变量可用表达式到达定值什么是到达定值“到达定值”是最常见的和有用的数据流模式之一。编译器能够根据到达定值信息知道 x 在点 p 上的值是否为常量,而如果 x 在点 p 上被使用,则调试器可以指出x是否未经定值就被使用。 如果存在一条从紧随在定值 d 后面的
原创
8369阅读
3评论
6点赞
发布博客于 5 年前

数据流分析(一)

引子编译器后端会对前端生成的中间代码做很多优化,也就是在保证程序语义不变的前提下,提高程序执行的效率或减少代码size等优化目标。优化需要依靠代码分析给出的“指导信息”来相应地改进代码,而代码分析中最重要的就是数据流分析。另外数据流分析是程序静态分析的基础。所以掌握数据流分析对编译后端极为重要。何为数据流分析数据流抽象数据流分析模式基本块上的数据流模式何为数据流分析 数据流分析指的是一
原创
16826阅读
4评论
8点赞
发布博客于 5 年前

LLVM全时优化

引子由于实验室项目原因,从本科开始接触Clang和LLVM开始到现在已经有2年时间了,期间都是针对Clang做一些边边角角的工作,没有潜下心来好好研读一下LLVM的paper。最近闲下来读了Chris Lattner那篇引用率高达2227的论文《LLVM: A Compilation Framework for Lifelong Program Analysis & Transformation》,
原创
6091阅读
0评论
5点赞
发布博客于 6 年前

基于栈的虚拟机 VS 基于寄存器的虚拟机

引子一直对虚拟机这个黑盒非常感兴趣,由于从前都是直接学习x86或者ARM这些实际的体系结构,什么寄存器、ALU、CPU、总线、乱序执行和Cache等相关的观念都已经烂熟于心。另外在学习C++或者C语言时,对函数调用栈帧非常熟悉,什么函数调用前压参、保存寄存器值、EBP、ESP或者函数返回值如何传递,更深层次的如对象的this指针如何传递,或者C++的RTTI以及C++内部的实现机制。但是对java里
原创
10012阅读
13评论
16点赞
发布博客于 6 年前

RTTI机制详解

引子以前我们探讨过,RTTI的访问和虚表相关,并且RTTI基本上是为了dynamic_cast<>和typeid以及异常而实现的。今天我们详细探讨下异常的实现机制。RTTI、虚表以及类的内存布局遵循的通常是Itanium C++ ABI,我不知道这个名字为什么会演化成现在这个样子,但是这个ABI标准是现今最流行的一个C++ABI标准。下面我们会精简地从中摘取出关于RTTI的相关内容。C++ABI中的
原创
1127阅读
0评论
2点赞
发布博客于 6 年前

编译器或者链接器会优化掉虚表吗

引子前一段时间和实验室的同学讨论虚表和RTTI相关的问题,由于我是编译器论调的拥泵,所以我信誓旦旦的说如果编译器发现虚表或者虚函数无用的话,会自动优化掉这些虚表信息。但是查过资料才发现,其实编译器并不会这么做!ODR原则在C++中有一个很重要的概念就是ODR原则,总的来说,ODR分为3个方面:一个模板,类型,函数或者”对象”可以在多个编译单元中各存在一份拷贝。其中的一些可以有任意数量的声明。一个定
原创
1450阅读
0评论
0点赞
发布博客于 6 年前

C++中的out-of-line虚函数

引子在现实编码过程中,曾经遇到过这样的问题“warning:’Base’ has no out-of-line method definition; its vtable will be emitted in every translation unit”。由于对这个warning感兴趣,于是搜集了相关资料来解释这个warning相关的含义。C++虚表内部架构Vague Linkageout-
原创
3984阅读
1评论
4点赞
发布博客于 6 年前

GC(Garbage Collection)对应用性能的影响

正如我们所了解的,垃圾回收的性能并不是由垃圾对象的数量决定的,而是由可达对象的数量所决定。越多的对象变为垃圾,垃圾回收的速度越快。如果在堆上的对象都是待回收的垃圾对象,垃圾回收周期几乎可以说是瞬时完成的。另外垃圾回收器必须暂停应用程序的执行,以保证对象树的完整性。发现的可达对象数量越多,暂停的时间越长,这对响应时间和吞吐量会有直接影响。译者注:现在垃圾回收思想都是通过根集来推导可达对象,并将可达对象
原创
3128阅读
0评论
0点赞
发布博客于 6 年前

人类的行为与程序计算

引子人类从出生伊始都在面临着生活中的种种问题,人类无时无刻不在进行着问题的解决过程。程序从设计之初也是用来解决生活中特定问题的。那么人类行为与程序计算理论之间又有什么相似性呢?人类人类所面临的问题人类解决问题的过程人类解决问题的过程与程序执行代码生成器人类人类是当今地球上最智慧的生物,这是无可置疑的,虽然部分动物也拥有智慧比如说部分灵长类动物。但是人类却远比其他动物高级的多,虽然人类和其
原创
1087阅读
0评论
0点赞
发布博客于 6 年前

C++中的Observer模式

引子什么时候Observer模式呢?对一个对象状态的更新,需要其他对象同步更新,而且其他对象的数量动态可变对象仅需要将自己的更新通知给其他对象而不需要知道其他对象细节许多时候,我们都需要当我们应用的一部分状态更新时,其他部分的状态能够相应的更新。有一种方式就是让接收者不断地去检查发送者的状态是否更新,这种方式有两种问题,首先会占用大量的CPU时间,然后就是接受者的状态不会立即的更新,总会有一定
原创
1426阅读
0评论
2点赞
发布博客于 6 年前

C++11中的POD和Trivial

引子在介绍C++11的文章或者博客中,经常会出现POD类型和Trivial类型的影子。但是POD类型和Trivial类型到底是什么意思呢?POD类型POD类型的好处POD类型粗略上来讲,POD是C++为兼容C的内存布局而设计的,主要用于修饰用户自定义类型。但POD却远比这个要复杂。POD(Plain Old Data),从字面意思上来看,是平凡普通的老旧格式的数据,POD是一个类型属性,既不是
原创
3208阅读
1评论
5点赞
发布博客于 6 年前

由C++构造函数初始值列表想到的

引子大家在编写C++代码的时候,总是会遇到下面这个问题,什么时候为构造函数提供初始值列表(当然,推荐做法都是以初始值列表代替构造函数体内赋值)。数据成员初始化动作是在构造函数体之前的,相对应的,析构函数的数据成员销毁动作是在析构函数体之后的。所常见的必须提供初始值列表的情况有,数据成员含有const成员变量数据成员含有引用数据成员中自定义类型没有默认构造函数前面两个比较好理解,
原创
643阅读
0评论
0点赞
发布博客于 6 年前

由计算机状态机到字符串相似

引子计算机解决问题时,就是状态机从一个状态集合跳转到另一个状态集合的过程。状态迁移的过程是由计算机程序(亦即计算机汇编指令)来控制的,不同的指令序列会导致截然不同的计算结果,前面已经提到过指令序列的相似程度和字符串的相似程度是不同的。那么从计算机执行指令序列,能够得到计算字符串相似问题什么启发呢?计算机指令序列前面提到不同的计算机指令序列,在相同输入情况下所导致的结果有可能是截然不同的
原创
515阅读
0评论
0点赞
发布博客于 6 年前

C++中的volatile

引子在阅读代码的过程中,相信大家都遇到过”volatile”这个关键字,有的人知道和编译器优化相关,甚至有的人根本不知道该关键字的功用volatile A type qualitier that you can use to declare that an object can be modified in the program by the hardware. —[volatile]考虑下
原创
525阅读
0评论
0点赞
发布博客于 6 年前

C++中的new/delete和new[]/delete[]

引子C++的new/deleteC++的new[]/delete[]C++的new/delete当我们使用一条new表达式时:// new表达式string *sp = new string("a value");string *arr = new string[10];实际执行了三步操作,第一步:new表达式调用一个名为operator new(或者operator new[])的标准库
原创
654阅读
0评论
0点赞
发布博客于 6 年前

C++中的"delete this"

引子C++中delete能否用于栈对象C++中”delete this”会出现什么问题C++中”delete this”有什么规避方法C++中delete能否用于栈对象在大家的印象中delete只能用于new出动态内存对象,我们使用了g++/Clang++/MSVC来测试delete栈对象的情况。测试代码如下:int main(){ int num = 10; int* p
原创
3253阅读
0评论
0点赞
发布博客于 6 年前

C++一种智能指针的实现

引子C++智能指针shared_ptr<>以对象管理资源一种智能指针的实现C++智能指针shared_ptr<>为了兼容C语言,并且由于垃圾回收的性能原因,C++没有引入垃圾回收。但是动态内存分配又是现实编码中不可或缺的一部分,由程序员自己控制分配和回收。C++11添加了智能指针shared_ptr<>,相当于使用另一种方式间接实现了部分垃圾回收。shared_ptr是模板,可以指向多个类型
原创
627阅读
0评论
0点赞
发布博客于 6 年前

static_cast<>在CRTP中的应用

CRTP是C++中实现静态多态(static polymorphism)的方式,这种实现方式能够提高运行时效率及减少内存消耗,在嵌入式领域相当有优势。这里估计会有人反驳,难道针对每个派生类实例化独有的基类难道不占有内存吗?编译时,实例化的独有基类确实会增加很多类型信息,但是这仅仅是类型信息,只存在于编译期。程序占内存的大小取决于数据段和代码段的大小,代码段只是一条条的汇编指令,里面根本没有类型信息,
原创
678阅读
0评论
0点赞
发布博客于 6 年前

static_cast<>能够适用所有转型吗,有什么条件

CheckStaticCast - Check that a static_cast(SrcExpr) is valid.Refer to C++ 5.2.9 for details. Static casts are mostly used for making implicit conversions explicit and getting rid of data loss warnings.
原创
2361阅读
0评论
0点赞
发布博客于 6 年前

dynamic_cast<>操作数必须是多态类型吗

dynamic_cast<>是C++运行时的一个类型转换运算符,通常用于自定义类型层次中的向下转型(downcasts),使用形式如下所示:dynamic_cast<type*>(e)dynamic_cast<type&>(e)dynamic_cast<type&&>(e)根据Primer中的解释,type必须是一个类类型,并且通常情况下该类型应该含有虚函数,即该类型是多态类型。也就是说有少
原创
3250阅读
0评论
0点赞
发布博客于 6 年前

C++实现机制RTTI

运行时类型识别(run-time type identification, RTTI)的功能由两个运算符实现:typeid运算符,用于返回表达式的类型。dynamic_cast<>运算符,用于将基类的指针或引用安全的转换成派生类的指针或引用。C++中没有JAVA中的反射机制,在运行时获得任何对象的类型信息,通常类型信息还非常丰富。C++只针对内置类型和多态的自定义类型实现了RTTI。C++引入
原创
928阅读
0评论
0点赞
发布博客于 6 年前

程序与自动机及静态分析杂想

引子有限状态自动机就是一些操作作用在状态上,导致状态和状态迁移的过程。程序运行就是用户向计算机输入信息并经过一系列的计算并从中获取结果信息的一个过程。而静态分析就是不实际执行程序通过初始状态模拟执行得到最终状态的过程。但是有限状态自动机,程序执行及静态分析之间有什么联系呢?更新:读了《计算的本质:深入剖析程序和计算机》这本书,才知道下面的思想这本书里都有详细而有系统的探讨过有限状态自动机与程序执行
原创
1112阅读
1评论
2点赞
发布博客于 6 年前

关于C/C++中内存分配与释放的疑惑?

关于C/C++中内存分配与释放的疑惑?在编写代码过程中,如果需要自己控制变量的生存周期或者栈空间不足以存放我们想要的数据时,我们就只能在堆上分配分配空间来管理我们的数据。在C/C++中,使用malloc/free和new/delete来创建和释放内存。当然手动管理内存永远是精巧危险但又有效率的做法,会存在内存泄露或者悬空指针的危险。指针在底层实现时,只是一个4字节的内存地址,附加在指针上的大小其实在
原创
857阅读
0评论
0点赞
发布博客于 6 年前

2002-12-LattnerMSThesis

这是LLVM和Swift作者克里斯拉特纳的博士毕业论文。其中着重讲解了LLVM的实现原理,对理解LLVM的机制很有帮助。
pdf
发布资源于 7 年前

Modern Compiler Design (David Galles 2004)

Modern Compiler Design (David Galles 2004)讲解现代编译器的设计,其中关于词法分析和语法分析部分,使用Lex和Yacc来实现。
pdf
发布资源于 7 年前

graphviz-2.38.msi

graphviz在windows下的安装包
msi
发布资源于 7 年前