假设我有一个基于Cocoa的Mac或iOS应用程序。我想在我的应用程序的源代码 或我的应用程序的二进制文件上运行静态分析器,以检索所有Objective-C方法的列表在其中称为。有没有可以做到这一点的工具?
几点:
我正在寻找静态解决方案。我不是在找dynamic solution。
可以对二进制代码或源代码运行的东西是可以接受的。
理想情况下,输出只是一个大规模的Objective-C方法列表,如:
… -[MyClass foo] … +[NSMutableString stringWithCapacity:] … -[NSString length] …(如果它没有被删除那么酷)
如果存在其他类型的符号(C函数,静态变量等),那很好。
我熟悉class-dump,但AFAIK,它会将声明的类转储到二进制文件中,而不是二进制文件中的调用方法 。那不是我想要的。如果我错了,你可以使用类转储执行此操作,请更正我。
我不完全确定这是可行的。所以,如果不是,那也是一个很好的答案。 :)
答案 0 :(得分:10)
我最接近的是otx
,它是otool
的包装器,可以在objc_msgSend()调用站点重建选择器。
答案 1 :(得分:7)
如果您要求查找所有方法的COMPLETE列表,那么这是静态和动态的,这是不可能的。原因是可以通过各种方式调用方法,甚至可以动态地和编程地组装方法。
除了使用诸如[Object message]
之类的Objective-C消息的常规方法调用之外,您还可以使用objc/message.h
中的C-API函数调度消息,例如objc_msgSend(str, del)
。 NSInvocation
。或者您可以使用performSelector:withObject:
API或NSSelectorFromString
(以及类似方法)发送它们,请参阅examples here。在所有这些情况下使用的选择器可以是静态字符串,或者甚至可以使用{{1}}之类的东西以编程方式从字符串构造。
更糟糕的是,Objective-C甚至支持dynamic message resolution,它允许对象响应根本不对应于方法的消息!
如果您只对特定的方法调用感到满意,那么解析上面列出的模式的源代码将为您提供在执行期间可能调用的最小方法列表。但是列表可能都是不完整的(即,不包含可能被调用的方法)以及过度完成(即,可能包含在实践中未调用的方法)。
答案 2 :(得分:0)
另一个很棒的工具是class-dump,这是我静态分析的第一选择。