使用infer让c++/java/c#项目质量更高

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块)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
根据提供的错误信息,你的代码中存在重复定义的问题。编译器指出在 `yolov8_generated_process.cu.o` 和 `yolov8.cpp.o` 文件中都重复定义了 `OUTPUT_BLOB_NAME` 和 `INPUT_BLOB_NAME` 变量。 这种错误通常发生在多个源文件中都包含了同一个头文件,并且该头文件中定义了全局变量。由于每个源文件都会被编译成独立的目标文件,因此重复定义的全局变量会导致链接时出现冲突。 要解决这个问题,你可以考虑将这些全局变量的定义放在一个单独的源文件中,并在其他需要使用这些变量的源文件中使用 `extern` 关键字进行声明。这样可以确保全局变量只有一份定义,并且可以在多个源文件中共享。 首先,在一个源文件(比如 `config.cpp`)中定义这些全局变量: ```cpp // config.cpp #include "config.h" const std::string INPUT_BLOB_NAME = "input_blob"; const std::string OUTPUT_BLOB_NAME = "output_blob"; ``` 然后,在其他源文件中使用 `extern` 关键字进行声明: ```cpp // yolov8_generated_process.cu #include "config.h" extern const std::string INPUT_BLOB_NAME; extern const std::string OUTPUT_BLOB_NAME; // 其他代码 ``` ```cpp // yolov8.cpp #include "config.h" extern const std::string INPUT_BLOB_NAME; extern const std::string OUTPUT_BLOB_NAME; // 其他代码 ``` 这样做可以确保全局变量只有一份定义,并且可以在多个源文件中共享使用。 请根据你的实际需求和代码结构,将全局变量的定义放在一个单独的源文件中,并在其他源文件中使用 `extern` 进行声明。如果问题仍然存在,请提供多相关代码以便我们好地帮助你解决问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

凌鲨

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值