Infer 是 Facebook 开源的静态程序分析工具,用于在发布移动应用之前对代码进行分析,找出潜在的问题。目前 Facebook 使用该工具来分析 Facebook 的 App,包括 Android 、iOS、Facebook Messenger 和 Instagram 等等。
Facebook 称该工具帮助其每个月检查出数百个应用中潜在的 Bug,例如一些空指针访问、资源和内存泄漏等等。支持 Android 的 Java 和 iOS 的 C 和 Objective-C 代码。
Infer可以使用增量模式,利用infer reportdiff来对每个PR进行评审。
使用gui配置工具
使用gui配置工具,可以让配置infer参数更简单。
在凌鲨(linksaas)的微应用里面可以找到infer助手,快速探索infer多个分析器。
凌鲨(linksaas)是以开源方式运作的,您可以从linksaas · 极狐GitLab 访问源代码。也可以从 凌鲨 软件研发团队信息枢纽 下载预编译的版本。
附录
分析器列表
- Annotation Reachability(注解可达性)
- Biabduction(Biabduction分析)
- Buffer Overrun Analysis (InferBO)(缓冲区溢出分析(InferBO))
- Config Checks between Markers(标记之间的配置检查)
- Config Impact Analysis(配置影响分析)
- Cost: Runtime Complexity Analysis(运行时复杂性分析)
- Eradicate(Eradicate分析)
- Impurity(副作用分析)
- Inefficient keySet Iterator(低效的键值集访问)
- Litho "Required Props(Litho必要属性分析)
- Liveness(存活分析)
- Loop Hoisting(循环效率分析)
- Pulse(Pulse分析)
- Purity(Purity分析)
- Quandary(Quandary分析)
- RacerD(数据竞争分析)
- Resource Leak checker for .NET(.NET资源泄露检测)
- Static Initialization Order Fiasco(静态数据初始化顺序检查)
- Self in Block(Self检查)
- Starvation(程序僵死检查)
- Topl(Topl分析)
- Uninitialized Value(未初始化值检查)
能检查的问题列表
- ARBITRARY_CODE_EXECUTION_UNDER_LOCK(任意代码执行处于锁定状态)
- ASSIGN_POINTER_WARNING(分配指针警告)
- AUTORELEASEPOOL_SIZE_COMPLEXITY_INCREASE(自动释放池大小复杂性增加)
- AUTORELEASEPOOL_SIZE_COMPLEXITY_INCREASE_UI_THREAD(自动发布池大小复杂性增加 UI 线程)
- AUTORELEASEPOOL_SIZE_UNREACHABLE_AT_EXIT(退出时无法到达自动释放池大小)
- BAD_POINTER_COMPARISON(坏指针比较)
- BIABDUCTION_MEMORY_LEAK(内存泄漏)
- BUFFER_OVERRUN_L1(缓冲区溢出 L1)
- BUFFER_OVERRUN_L2(缓冲区溢出 L2)
- BUFFER_OVERRUN_L3(缓冲区溢出 L3)
- BUFFER_OVERRUN_L4(缓冲区溢出 L4)
- BUFFER_OVERRUN_L5(缓冲区溢出 L5)
- BUFFER_OVERRUN_S2(缓冲区溢出 S2)
- BUFFER_OVERRUN_U5(缓冲区溢出 U5)
- CAPTURED_STRONG_SELF(捕获的强Self)
- CHECKERS_ALLOCATES_MEMORY(内存分配检查)
- CHECKERS_ANNOTATION_REACHABILITY_ERROR(注释可访问性错误)
- CHECKERS_CALLS_EXPENSIVE_METHOD(调用的昂贵方法)
- CHECKERS_EXPENSIVE_OVERRIDES_UNANNOTATED(昂贵的未注释覆盖)
- CHECKERS_FRAGMENT_RETAINS_VIEW(片段保留视图)
- CHECKERS_IMMUTABLE_CAST(检查不可变转换)
- CHECKERS_PRINTF_ARGS(检查printf参数)
- COMPONENT_WITH_MULTIPLE_FACTORY_METHODS(具有多种工厂方法的组件)
- CONDITION_ALWAYS_FALSE(条件始终为假)
- CONDITION_ALWAYS_TRUE(条件始终为真)
- CONFIG_CHECKS_BETWEEN_MARKERS(标记之间的配置检查)
- CONFIG_IMPACT(配置影响)
- CONSTANT_ADDRESS_DEREFERENCE(常量地址解引用)
- CREATE_INTENT_FROM_URI(从 Uri 创建意图)
- CROSS_SITE_SCRIPTING(跨站点脚本)
- CXX_REFERENCE_CAPTURED_IN_OBJC_BLOCK(在 Objc 块中捕获的 Cxx 参考)
- DANGLING_POINTER_DEREFERENCE(悬空指针解引用)
- DEADLOCK(死锁)
- DEAD_STORE(未使用变量)
- DIRECT_ATOMIC_PROPERTY_ACCESS(直接原子属性访问)
- DISCOURAGED_WEAK_PROPERTY_CUSTOM_SETTER(不鼓励的弱属性自定义setter)
- DIVIDE_BY_ZERO(除零)
- DOTNET_RESOURCE_LEAK(.NET 的资源泄漏检查器)
- EMPTY_VECTOR_ACCESS(空集合访问)
- ERADICATE_ANNOTATION_GRAPH(注释图)
- ERADICATE_BAD_NESTED_CLASS_ANNOTATION(@Nullsafe注释与外部类不一致)
- ERADICATE_CONDITION_REDUNDANT(条件冗余)
- ERADICATE_FIELD_NOT_INITIALIZED(字段未初始化)
- ERADICATE_FIELD_NOT_NULLABLE(字段不可为空)
- ERADICATE_FIELD_OVER_ANNOTATED(字段过度注释)
- ERADICATE_INCONSISTENT_SUBCLASS_PARAMETER_ANNOTATION(不一致的子类参数注释)
- ERADICATE_INCONSISTENT_SUBCLASS_RETURN_ANNOTATION(不一致的子类返回注释)
- ERADICATE_META_CLASS_CAN_BE_NULLSAFE(类有 0 个问题,可以标记为@Nullsafe)
- ERADICATE_META_CLASS_IS_NULLSAFE(类标记为@Nullsafe并且有 0 个问题)
- ERADICATE_META_CLASS_NEEDS_IMPROVEMENT(类需要改进才能成为@Nullsafe)
- ERADICATE_NULLABLE_DEREFERENCE(存在空指针解引用)
- ERADICATE_PARAMETER_NOT_NULLABLE(参数不可为空)
- ERADICATE_REDUNDANT_NESTED_CLASS_ANNOTATION(@Nullsafe注释是多余的)
- ERADICATE_RETURN_NOT_NULLABLE(返回不能为空)
- ERADICATE_RETURN_OVER_ANNOTATED(返回注释)
- ERADICATE_UNCHECKED_USAGE_IN_NULLSAFE(空安全模式:未经检查的值使用)
- ERADICATE_UNVETTED_THIRD_PARTY_IN_NULLSAFE(空安全模式:未经审查的第三方的未经检查的使用)
- EXECUTION_TIME_COMPLEXITY_INCREASE(执行时间复杂性增加)
- EXECUTION_TIME_COMPLEXITY_INCREASE_UI_THREAD(执行时间复杂性增加 UI 线程)
- EXECUTION_TIME_UNREACHABLE_AT_EXIT(退出时无法到达执行)
- EXPENSIVE_AUTORELEASEPOOL_SIZE(昂贵的自动释放池大小)
- EXPENSIVE_EXECUTION_TIME(昂贵的执行时间)
- EXPENSIVE_LOOP_INVARIANT_CALL(昂贵的循环不变调用)
- EXPOSED_INSECURE_INTENT_HANDLING(暴露的不安全意图处理)
- GLOBAL_VARIABLE_INITIALIZED_WITH_FUNCTION_OR_METHOD_CALL(使用函数或方法调用初始化的全局变量)
- GUARDEDBY_VIOLATION(违反@GuardedBy)
- GUARDEDBY_VIOLATION_NULLSAFE(@Nullsafe类中的GuardedBy违规)
- IMPURE_FUNCTION(非纯函数)
- INEFFICIENT_KEYSET_ITERATOR(低效键集迭代器”)
- INFERBO_ALLOC_IS_BIG(申请过大内存)
- INFERBO_ALLOC_IS_NEGATIVE(负数大小的内存申请)
- INFERBO_ALLOC_IS_ZERO(申请0空间内存)
- INFERBO_ALLOC_MAY_BE_BIG(可能申请过大内存)
- INFERBO_ALLOC_MAY_BE_NEGATIVE(存在负数大小的内存申请)
- INFINITE_AUTORELEASEPOOL_SIZE(无限自动释放池大小)
- INFINITE_EXECUTION_TIME(无限执行时间)
- INSECURE_INTENT_HANDLING(不安全意图处理)
- INTEGER_OVERFLOW_L1(整数溢出 L1)
- INTEGER_OVERFLOW_L2(整数溢出 L2)
- INTEGER_OVERFLOW_L5(整数溢出 L5)
- INTEGER_OVERFLOW_U5(整数溢出 U5)
- INTERFACE_NOT_THREAD_SAFE(接口线程不安全)
- INVARIANT_CALL(不变调用)
- IPC_ON_UI_THREAD(Ui线程上的Ipc)
- IVAR_NOT_NULL_CHECKED(ivar缺乏空检查)
- JAVASCRIPT_INJECTION(javascript注入)
- LOCKLESS_VIOLATION(无锁违规)
- LOCK_CONSISTENCY_VIOLATION(锁一致性违规)
- LOGGING_PRIVATE_DATA(记录隐私数据)
- MEMORY_LEAK(内存泄漏)
- MISSING_REQUIRED_PROP(缺少必要属性)
- MIXED_SELF_WEAKSELF(混合使用self和weakSelf)
- MODIFIES_IMMUTABLE(修改不可变值)
- MULTIPLE_WEAKSELF(多个weakSelf)
- MUTABLE_LOCAL_VARIABLE_IN_COMPONENT_FILE(组件文件中的可变本地变量)
- NIL_MESSAGING_TO_NON_POD(向非Pod发送空消息)
- NULLPTR_DEREFERENCE(空指针解引用)
- NULL_DEREFERENCE(空指针解引用)
- OPTIONAL_EMPTY_ACCESS(可选空访问)
- PARAMETER_NOT_NULL_CHECKED(参数未检查为空)
- POINTER_TO_CONST_OBJC_CLASS(指向Const Objc类的指针)
- PREMATURE_NIL_TERMINATION_ARGUMENT(缺失的零结尾参数)
- PULSE_UNINITIALIZED_VALUE(未初始化值)
- PURE_FUNCTION(纯功能)
- QUANDARY_TAINT_ERROR(污染错误)
- RESOURCE_LEAK(资源泄漏)
- RETAIN_CYCLE(循环获取)
- SHELL_INJECTION(shell注入)
- SHELL_INJECTION_RISK(shell注入风险)
- SQL_INJECTION(sql注入)
- SQL_INJECTION_RISK(sql注入风险)
- STACK_VARIABLE_ADDRESS_ESCAPE(无效栈地址)
- STARVATION(程序僵死)
- STATIC_INITIALIZATION_ORDER_FIASCO(静态初始化顺序失效)
- STRICT_MODE_VIOLATION(违反严格模式)
- STRONG_DELEGATE_WARNING(强代理警告)
- STRONG_SELF_NOT_CHECKED(strongSelf未检查)
- THREAD_SAFETY_VIOLATION(违反线程安全)
- THREAD_SAFETY_VIOLATION_NULLSAFE(@Nullsafe类线程安全冲突)
- TOPL_ERROR(违反Topl属性)
- UNINITIALIZED_VALUE(未初始化的值)
- UNREACHABLE_CODE(无法访问的代码)
- UNTRUSTED_BUFFER_ACCESS(不受信任的缓冲区访问)
- UNTRUSTED_DESERIALIZATION(不受信任的反序列化)
- UNTRUSTED_DESERIALIZATION_RISK(不受信任的反序列化风险)
- UNTRUSTED_ENVIRONMENT_CHANGE_RISK(不受信任的环境更改风险)
- UNTRUSTED_FILE(不受信任的文件)
- UNTRUSTED_FILE_RISK(不受信任的文件风险)
- UNTRUSTED_HEAP_ALLOCATION(不受信任的堆分配)
- UNTRUSTED_INTENT_CREATION(不受信任的意图创建)
- UNTRUSTED_URL_RISK(不受信任的 URL 风险)
- UNTRUSTED_VARIABLE_LENGTH_ARRAY(不受信任的可变长度数组)
- USER_CONTROLLED_SQL_RISK(用户控制的 SQL 风险)
- USE_AFTER_DELETE(删除后使用)
- USE_AFTER_FREE(释放后使用)
- USE_AFTER_LIFETIME(使用过期地址)
- VECTOR_INVALIDATION(向量地址无效)
- WEAK_SELF_IN_NO_ESCAPE_BLOCK(weakSelf中非Escape块)