About

KyleWong, an software developer from China. Dedicated to make a difference, he is sparing no efforts to make the best. Be an experienced expert, participate in and contribute to some great product. If possible, create a great product with his team-mate. Be a good person, kind, mature, healthy, live the life he wants in his own heart. This is my blog for some technological posts. Thanks for your visiting!

Latest Blog Post

01 Nov 2016 . tech . Clang技术分享系列三:API有效性检查 Comments

问题背景 iOS API(Class/Protocol的Interface,Property,Const,Function)的start/deprecated的判断依赖两个方面: 1.获得所有的API调用,包括OC消息发送,C API调用,常量使用等; 2.获取所有的API支持版本信息 将1中的API调用,在2中做搜索比对,并结合APP的deploy target和最新的支持系统,判断API的有效性,如果API在deploy target之后开始或者在当前系统之前(包括当前系统)废弃,则提示用户。 第二个问题可以参见我的另一篇blog(XCODE8 API文档解析),本文主要介绍问题1. XCODE8 API文档解析 分析APP源代码API数据结构准备 1.类接口以及继承体系(clsInterfHierachy) 此数据结构记录了所有位于AST(抽象语法树)上的接口内容,最终的解析结果如下图所示: 以AppDelegate为例,interfs代表其提供的接口(注:他的property window对应的getter和setter也被认为是interf一部分);isInSrcDir代表此类是否位于用户目录(将workspace的根目录作为参数传给clang)下,protos代表其conform的协议,superClass代表接口的父类。 这些信息获取入口位于VisitDecl(Decl *decl)的重载函数里,相关的decl有ObjCInterfaceDecl,ObjCCategoryDecl,ObjCPropertyDecl,ObjCMethodDecl. 2.接口方法调用(clsMethod) 此数据结构记录了所有包含源代码的OC方法,最终解析结果如下所示: 以-[AppDelegate application:didFinishLaunchingWithOptions:]为例,callee代表其调用到的接口(此处为可以明确类型的,对于形如id<XXXDelegate>随后介绍),filename为此方法所在的文件名,range为方法所在的范围,sourceCode为方法的具体实现源代码。 这些信息获取入口位于VisitDecl(Decl *decl)和VisitStmt(Stmt *stmt)的重载函数里,相关的decl有ObjCMethodDecl,stmt有ObjCMessageExpr. 此处除过正常的-/+[Cls message]为,还有其他较多的需要考虑的情形,已知且支持的分析包括: NSObject协议的performSelector方法簇,[obj performSelector:@selector(XXX)]不仅代表了[obj performSelector:]也代表了[obj XXX].(下同) 手势/按钮的事件处理selector addTarget:action:/initWithTarget:action:/addTarget:action:forControlEvents: NSNotificationCener添加通知处理Selector addObserver:selector:name:object: UIBarButtonItem添加事件处理Selector initWithImage:style:target:action:/initWithImage:landscapeImagePhone:style:target:action:/initWithTitle:style:target:action:/initWithBarButtonSystemItem:target:action: Timer scheduledTimerWithTimeInterval:target:selector:userInfo:repeats:/timerWithTimeInterval:target:selector:userInfo:repeats:/initWithFireDate:interval:target:selector:userInfo:repeats: NSThread detachNewThreadSelector:toTarget:withObject:/initWithTarget:selector:object: CADisplayLink displayLinkWithTarget:selector: KVO机制 IBAction机制 如基于xib/Storyboard的ViewController中-(IBAction)onBtnPressed:(id)sender方法,认为暗含了+[ViewController的 alloc]对于+[ViewController的 onBtnPressed:]的调用关系。 [XXX new] 暗含了+[XXX alloc]和-[XXX init] 3.类Property对应的getter/setter(clsPropertyGS) 此数据结构记录了所有类的property与getter/setter之间的对应关系,最终结果如下所示: 这些信息获取入口位于VisitDecl(Decl *decl)的重载函数里,相关的decl有ObjCPropertyDecl. 4.变量/枚举/变量等(funcEnumVar) 此数据结构记录了所有使用到的函数,枚举和变量,最终结果如下所示: …

View more posts

Timeline

  • March 2017 - Today

    Architecture

  • June 2015 - March 2017

    Still iOS development

  • April 2013 - June 2015

    Begin iOS development

  • September 2006 - March 2013

    Student

Contact

Drop me an email if interested!