摘要: 最近在开发的过程中遇到了几个很诡异的问题,造成了栈不平衡从而导致程序崩溃。 经过几经排查发现是和调用规约(calling convention)相关的问题,特此分享出来。 首先,讲一下什么是调用规约。 函数调用规约,是指当一个函数被调用时,函数的参数会被传递给被调用的函数和返回值会被返回给调用函数。 阅读全文
posted @ 2017-07-04 16:58 saintlas 阅读(1759) 评论(1) 推荐(3) 编辑
摘要: 非本地跳转(unlocal jump)是与本地跳转相对应的一个概念。 本地跳转主要指的是类似于goto语句的一系列应用,当设置了标志之后,可以跳到所在函数内部的标号上。然而,本地跳转不能将控制权转移到所在程序的任意地点,不能跨越函数,因此也就有了非本地跳转。 C语言里面提供了setjmp和longj 阅读全文
posted @ 2016-11-29 22:55 saintlas 阅读(3582) 评论(0) 推荐(2) 编辑
摘要: 这几天,一位做Android的朋友和我探讨了一个问题:因为业务需求的原因,在自己的App长时间不使用被kill掉之后,如何让它再重新运行起来。 虽然,我本身很排斥这种做法,有点类似“流氓软件”的行为,但是还是查询了资料,大概想了一个实现的方式,和大家一起分享。 其实,这个问题可以简单的看作:如何编写 阅读全文
posted @ 2016-09-16 18:03 saintlas 阅读(5218) 评论(0) 推荐(0) 编辑
摘要: 我们在C++中使用STL的容器时,经常会用到迭代器。使用迭代器可以很方便的进行容器元素遍历和修改等操作。 近日,在使用Visual Studio 2015编程的时候发现,set的迭代器直接就是const_iterator类型,而vector的迭代器则是普通的iterator类型,这是为什么呢?今天就 阅读全文
posted @ 2016-09-04 21:00 saintlas 阅读(13135) 评论(0) 推荐(2) 编辑
摘要: 我们经常会发现网页中的许多数据并不是写死在HTML中的,而是通过js动态载入的。所以也就引出了什么是动态数据的概念, 动态数据在这里指的是网页中由Javascript动态生成的页面内容,是在页面加载到浏览器后动态生成的,而之前并没有的。 在编写爬虫进行网页数据抓取的时候,经常会遇到这种需要动态加载数 阅读全文
posted @ 2016-08-05 12:51 saintlas 阅读(63681) 评论(0) 推荐(1) 编辑
摘要: Clang中包含了非常多的关于抽象语法树(AST)的访问和操作的类和接口。我们程序开发人员可以直接通过继承其中的某些类,重写其中的关键成员方法,从而形成我们自己的对抽象语法树的操作。 那么,首先我们简要介绍几个概念: 抽象语法树(AST):抽象语法树是源代码的抽象语法结构的树状表现形式。树上的每个节 阅读全文
posted @ 2016-08-04 23:16 saintlas 阅读(2616) 评论(0) 推荐(0) 编辑
摘要: LLVM是构架编译器(compiler)的框架系统,以C++编写而成,用于优化以任意程序语言编写的程序的编译时间(compile-time)、链接时间(link-time)、运行时间(run-time)以及空闲时间(idle-time),对开发者保持开放,并兼容已有脚本。LLVM计划启动于2000年 阅读全文
posted @ 2016-08-04 23:00 saintlas 阅读(12976) 评论(0) 推荐(1) 编辑
摘要: LLVM 是一个开源的编译器架构,它已经被成功应用到多个应用领域。Clang是 LLVM 的一个编译器前端,它目前支持 C, C++, Objective-C 以及 Objective-C++ 等编程语言。Clang 对源程序进行词法分析和语义分析,并将分析结果转换为 AST ( 抽象语法树 ) , 阅读全文
posted @ 2016-08-04 22:58 saintlas 阅读(7462) 评论(0) 推荐(0) 编辑
摘要: 众所周知,我们在编程的时候经常会在函数中声明局部变量(包括普通类型的变量、指针、引用等等)。 同时,为了满足程序功能的需要,函数的返回值也经常是指针类型或是引用类型,而这返回的指针或是引用也经常指向函数中我们自己声明的局部变量。 这样,程序在某些情况下就可能存在一定的问题。看似很简单的问题,通过仔细 阅读全文
posted @ 2016-08-04 22:56 saintlas 阅读(1297) 评论(0) 推荐(0) 编辑
摘要: 我们都知道,在C++中有很多类型转换。今天在这里,我们不讨论普通变量的类型转换(比如int转换成double等等)。本文主要讨论面向对象相关的类型转换:向上转换和向下转换。 首先,我们定义一个基类Base和继承类Derived,相关代码如下: 向上转换:指的是子类向基类的转换。即:Derived向B 阅读全文
posted @ 2016-08-04 22:55 saintlas 阅读(335) 评论(0) 推荐(0) 编辑