ChatGPT在源代码静态分析中可靠吗?

安全之安全(security²)博客目录导读


目录

引文

例0基础代码片段

例1流敏感(误报)

例2 路径敏感(误报)

例3 上下文敏感(误报)

例4 域敏感(漏报)

小结


引文

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

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

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

0基础代码片段

1680760553_642e5ee97e180f1b9cbfd.gif!small?1680760554450

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

例1流敏感(误报)

1680760570_642e5efaaca40b4027fce.gif!small?1680760571421

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

路径敏感(误报)

1680760586_642e5f0a4afe2876195f6.gif!small?1680760586981

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

1680760609_642e5f21cdbb67445dd29.gif!small?1680760610844

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

上下文敏感(误报)

1680760632_642e5f38b7a8091b460aa.gif!small?1680760633429

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

域敏感(漏报)

1680760647_642e5f47b72838eb97792.gif!small?1680760648634

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

1680760659_642e5f536f916995ccf39.gif!small?1680760660190

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

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

小结

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

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

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

参考:鸿渐科技ChatGPT在源代码分析中可靠吗?_鸿渐科技的博客-CSDN博客

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值