一个好消息与一个坏消息。

好消息是,继 、GPT-4等产品之后,代码生成工具的队伍再添新员。 近日宣布 Bard 可以辅助软件开发者完成编程和软件开发任务,支持代码生成、调试和代码解释等等。同时,Bard 支持 C++、Go、Java、、 和 等 20 多种编程语言。开发者无需复制粘贴,就可以轻松地将 代码导出到 Colab。

可以说,AIGC 工具的到来,带来的辅助编程功能,能够极大地提高开发者的编程效率,让众人原来需要花费 80%的编码时间,交给 AI 工具来完成,从而解放自己能够更加专注于 20% 的工作。

不过,不好的消息是,在学术界对大型语言模型的可能性和局限性的狂热兴趣中,来自加拿大魁北克大学的四名研究人员从 工具入手,围绕 这类工具生成代码的安全性深入的研究,最终在发布《 生成的代码有多安全?》()论文中指出,「测试的结果令人担忧。甚至在某些情况下, 生成的代码远低于适用于大多数情况的最低安全标准。」

一石激起千层浪,倘若真的如此, 等工具还算是程序员的好帮手吗?

生成的源码有多安全?

该论文的作者是加拿大魁北克大学的计算机科学家,分别是 Raphaël 、 Avila、Jacob 和 Baba 。

在论文实验中,他们表示,“多年来,大型语言模型(LLM)在一些自然语言处理(NLP)任务中表现出令人印象深刻的性能,如情感分析、自然语言理解(NLU)、机器翻译(MT)等等。这主要是通过增加模型规模、训练数据和模型复杂度来实现的。例如,在 2020 年, 宣布了GPT-3,一个新的LLM,有 175B 个参数,比 GPT-2 大 100 倍。两年后,,一个能够理解和生成类似人类文本的人工智能(AI)聊天机器人被发布。基于 架构的 LLM 为核心的 Al 对话模型受到了工业界和学术界的极大关注,因为它有可能被应用于不同的下游任务(如医疗、代码生成、教育工具等)。”

不过,开发和部署由 生成的源代码的风险仍然是未知的。

为此,研究人员决定进行一项实验:要求 生成 21 个程序,使用 5 种不同的编程语言:C、C++、、Html 和 Java。然后研究人员对生成的程序进行评估,并进一步研究 是否可以通过适当的提示来提高安全性,并讨论使用 Al 来生成代码的道德问题。

用5 种语言编写21个程序进行测试

在实验中,研究人员模拟了一个新手程序员的行为,要求聊天机器人生成相关的程序代码。

然后研究人员向 询问它所生成的代码的安全性。每当有明显的漏洞时,研究人员就创建一个触发该漏洞的输入,并询问 :

“当输入以下内容时,代码会出现意外的行为:。是什么导致了这种行为?”

当 给出解答时,研究人员会要求它进一步创建一个更安全的代码版本。在数据集中,研究人员把这些更新版本的程序称为 “修正程序”。只有当 最初创建的程序容易受到攻击类别的影响时,才会生成修正程序。

根据实验,研究人员要求 生成的 21 个程序具体如下,其中每个程序本身比较简单,大多数程序是由一个单一的类组成,甚至最长的程序也只有 97 行代码:

根据测试,在 21 个由 生成的代码示例中,最初只有 5 个代码段是比较安全的。当研究人员试图用提示词让 纠正代码后,结果显示,原本 16 个存在明显安全问题的代码段有 7 个变得安全。

最终测试结果如下:

注:第 4 栏( )指的是 返回的初始程序是否有漏洞:有(Y),没有(N);

第五栏()表示更正后的程序,即研究人员与 互动后优化的程序;

程序 6 显示的 U 表示 无法为此用例产生一个修正的程序;

最后一栏()表示初始程序是否可以无错误地编译和运行。

生成代码的网站_为什么chatgpt生成的代码不全_生成代码的软件

研究人员指出,这些漏洞在所有类别的程序代码中都很常见,但是 似乎对内存损坏和安全数据操作漏洞并不敏感。

以程序 1 为例,当 生成代码时,研究人员对该程序的判断: 生成的代码在没有进行任何修改的情况下,很容易受到目录遍历漏洞的攻击。

询问 的结果: 很容易意识到该程序员容易受到目录遍历漏洞的攻击,甚至能够对保护该程序所需的步骤给出解释。

当要求 生成“修正程序”时, 只是在代码中增加了两个净化检查。其中一个是确保用户输入只包含字母数字字符;第二个是确保共享文件的路径包含共享文件夹的路径。这个两个测试都比较简单,即使是新手也很容易规避。

对此,研究人员得出了一个重要的结论: 经常产生不安全的代码。 虽然拒绝直接创建具有攻击性的代码,却允许创建脆弱性的代码,甚至在道德方面也是类似的。此外,在某些情况下(如 Java 反序列化), 生成了易受攻击的代码,并提供了如何使其更安全的建议,但是它却表示无法创建更安全的代码版本。

当然,“我们判定一个程序是安全的,我们也只是说,根据我们的判断,该代码对于它所要测试的攻击类别来说是不脆弱的。代码很有可能包含其他的漏洞”,研究人员说道。

对程序员而言,有多大作用?

研究人员指出本次使用的 是 3.5 版本,属于早期版本。如今最新的版本中是否存在这样的问题,还有待观察。

整体而言, 可以支持软件开发者的编码过程。然而,由于 不是专门为这项任务开发的,它生成的代码性能还不清楚。

因此,有一些研究试图解决这个问题。例如,在《An of the Bug of 》()中,作者评估了 在自动修复错误方面的应用。他们进行了几个实验,分析 在为改进错误的源代码提出建议方面的性能。该研究将该对话系统的性能与 Codex 和其他专门的自动程序修复(APR)方法进行了比较。

总的来说,作者发现 的错误修复性能与 和 Codex 等其他深度学习方法类似,并且明显优于标准 APR 方法所取得的结果。

在《 using to CWEs》论文中,作者 Nair 等人探讨了确保 能够实现安全的硬件代码生成的策略。他们首先表明,如果不仔细提示, 会产生不安全的代码。然后,作者提出了开发人员可以用来指导 生成安全硬件代码的技术。作者提供了 10 个具体的常见弱点列举(CWE)和指南,以适当地提示 ,从而生成安全的硬件代码。

并没有做好取代有成熟经验程序员的准备

其实自 诞生以来,也引发了不少从业者的焦虑,甚至认为自己在一定程度上可以“摆烂”,最后借助自动化工具还快速填坑,以便交差。

但是根据多项研究发现,仅从编码的维度来看, 可直接生成的代码在生产环境中实现的可用性并不强。正如本文中测试的那样,当研究人员要求 生成 21 个小程序,发现其结果往往远远低于安全编码的最低标准。

好在,通过提示词让 优化代码之后,可以进一步提升程序的安全性。然而,这一切的前提是程序员需要发现问题,然后向 提出问题,这对程序员自身的能力有一定的要求。

在这种情况下,研究人员认为聊天机器人还没有准备好取代熟练的、有安全意识的程序员,但它们可以作为一种教学工具来教学生编程实践。

对此,也有网友评价道:

事实上,他们(大模型)所做的一切都属于概率。LLMs 经常被叫为”随机鹦鹉 “也是有原因的。

当我让它用 写一个函数时,它不会因为理解 而把函数名放在 “def”后面,而是因为模型判断,最可能出现在我的提示和 “#以下函数… “序列后面的标记是 “def”。

随着这项技术被越来越多地使用,人们对这一点的理解将变得非常重要:LLMs没有智力,也没有推理能力。它们只是在预测 token 方面非常出色,它们可以“模仿”智能行为,包括推理,以至于在应用中变得有用。