ChatGPT在源代码分析中可靠吗?
作者: 日期:2023年04月07日 阅:1,449

引文

ChatGPT自发布以来,它在各行各业都掀起了一股学习热潮。由于其惊人的语言理解和生成能力,ChatGPT已经备受全世界瞩目。它在智能对话、翻译、摘要、文本生成等领域中展现出了非凡的能力,让人们对其充满了好奇、敬畏和赞叹之情,同时开始怀疑自己的行业是否马上就会被人工智能所替代,甚至感到担忧。

作为代码分析领域中的从业者,GPT是否对这个领域具有较强的冲击力呢?本文将以敏感性这个代码分析中最重要的指标对GPT进行简单的测试以探究ChatGPT在敏感性相关的代码分析过程中的表现,我们以C/C++程序中关注度较高的内存泄漏为例进行测试。在测试中,我们发现ChatGPT展现出了一定的精度和检测能力,能够识别和定位部分代码中潜在的内存泄漏问题。但与绝大部分自动检测工具类似,也会在一些敏感性相关的代码分析中表现不足,出现较低级误报和漏报。

以下是一些内存泄漏相关的片段代码在ChatGPT中的分析结果与误漏报分析。

例0 基础代码片段

分析:ChatGPT对于该例子的判断和分析过程都是正确的。我们在此例子上增加敏感性看看他的表现。

例1 流敏感(误报)

误报分析:对代码稍做修改,增加流敏感性,将flag的初值设置为1,然后再改为0,chatGPT检测的结果是误报,且分析过程也出现了错误。采用我们的代码分析工具做了流敏感分析是不会出现该误报的。

例2 路径敏感(误报)

分析:虽然chatGPT给出的判断结果是正确的,但是分析过程存在一些问题。第一个条件语句中,如果a小于b,就将b重置为a-1,那么第二个条件的a<b就一定不成立,所以肯定会导致内存泄漏,但chatGPT分析不出来第一个条件分支执行后对第二个条件分支的影响,所以给出的分析是一些笼统的判断。

误报分析:这是一个路径敏感的小例子,ChatGPT给出的结果是误报。在第一个条件判断中,如果a>=b,那么b会被重置为a+1,以保证第二个条件语句的条件a<b一定成立,那么程序肯定会调用free(ptr)语句,因此不存在内存泄漏问题。所以chatGPT给出的判断和分析都不正确。采用我们的代码分析工具是做了常量传播是不会出现该误报的。

例3 上下文敏感(误报)

误报分析:这是一个典型的上下文敏感的例子,chatGPT给出的判断结果显然是误报。ptr1将调用函数Fun分配内存,ptr2同样调用了函数Fun,但并没有分配内存。在函数结尾处释放了ptr1,不存在内存泄漏问题。而chatGPT分析中得到了ptr2为NULL指针,却又说另一个内存块没有被释放,明显是错误的。

例4 域敏感(漏报)

漏报分析:chatGPT给出的判断是不存在内存泄漏,很明显这是漏报。分析中指出了分配了两块内存,只释放了一块内存,分析结果却是“没有任何未释放的内存块,不会发生内存泄漏”。采用我们的代码分析工具,对每个内存段都建立的模型就不会出现该漏报。

分析:同样的例子,当将参数改为free(ptr[1]),chatGPT给出的判断结果仍是不存在内存泄漏,所以仍是漏报。分析中指出了分配了两块内存,只释放了一块内存,分析过程说是剩余的内存由程序退出时释放。

分析:笔者反复将free(ptr[0])和free(ptr[1])修改几次,chatGPT给出的结果是free(ptr[1])判断有内存泄漏,free(ptr[0])没有内存泄漏。与前面的结果对比,在分析过程中出现了同样的代码,却给出了不同的判断结果,这种情况让使用者产生了极大的困惑。根据笔者的经验,在代码分析工具使用过程中,多次结果的不一致问题是不可接受的,可靠性同样是衡量工具优劣的重要指标之一。

小结

通过对上述片段代码在ChatGPT中进行简单测试后,不难发现,尽管ChatGPT在一定程度上能够帮助代码分析,但其分析结果的准确性仍具有很大的不确定性,特别是在处理敏感性相关的代码时,这种不确定性可能会更加明显,而这本身也是静态代码分析中的重点和难点。但是总体来说GPT仍旧具备一定的竞争力,

  1. 能够支持编译不通过即片段代码的分析,这也是大多数静态分析工具不具备的。
  2. 具备的静态分析工具的不具备的缺陷模式自动采集能力。绝大多数静态分析工具针对新的缺陷类型往往都是靠经验总结,新模式也需要在检测器中增加新的代码。但是GPT这些工作都是自动的,这也是传统代码分析工具无法做到的。

所以,我们认为GPT更多的是知识型的分析方法,不是符号逻辑型的。这两种方法是可以做到互补来提高代码分析工具的能力。当传统的代码分析工具,受困于状态爆炸必须进行折中而存在较高的误漏时,也可以结合AI的方式来进一步提高检测精度,突破现有分析能力的瓶颈。

鸿渐科技的代码分析技术正是结合了基于值依赖分析的符号逻辑分析技术和基于AI模式的自动模式生成技术以产生新的缺陷模式和函数摘要快速收集新的漏洞缺陷知识,同时也可以做到编译不通过情况下的片段代码分析,以达到更优的检测效果。

扫码关注我们

申明:本文系厂商投稿收录,所涉观点不代表安全牛立场!


相关文章