CXYVIP官网源码交易平台_网站源码_商城源码_小程序源码平台-丞旭猿论坛
CXYVIP官网源码交易平台_网站源码_商城源码_小程序源码平台-丞旭猿论坛
CXYVIP官网源码交易平台_网站源码_商城源码_小程序源码平台-丞旭猿论坛

爱分析的金融男(全程干货)大数据ai分析,AI生成的代码你敢用吗?有人给最近走红的Copilot做了个风险评估,丞旭猿免费源码交易平台,

1.金融ai数据分析师 易学

选自gist.github作者:0xabad1dea机器之心编译编辑:Panda近日,GitHub 推出了一款利用人工智能生成模型来合成代码的工具——Copilot,但发布之后却饱受争议,包括版权争议、奇葩注释 和涉嫌抄袭。

2.央视官网爱分析的金融男

除此之外,生成的代码能不能用、敢不敢用也是一大问题在这篇文章中,Copilot 测试受邀用户 0xabad1dea 在试用该代码合成工具后发现了一些值得关注的安全问题,并以此为基础写了一份简单的风险评估报告。

3.ai数据分析与金融科技

GitHub 真好,就算我因为 ICE 已经叨扰了他们好几百次,他们还是给予了我进入 Copilot 测试阶段的权限这次,我不关心 Copilot 的效率,只想测试它的安全性我想知道,让 AI 帮人写代码风险有多高。

4.爱分析公司怎么样

每一行提交的代码都需要人来负责,AI 不应被用于「洗刷责任」Copilot 是一种工具,工具要可靠才能用木工不必担心自己的锤子突然变坏,进而在建筑物内造成结构性缺陷同样地,程序开发者也应对工具保有信心,而不必担心「搬起石头砸自己的脚」。

5.爱分析官网

在 Twitter 上,我的一位关注者开玩笑说:「我已经迫不及待想用 Copilot 写代码了,我想让它写一个用于验证 JSON 网页 token 的函数,然后看都不看就提交上去。」

6.爱分析是做什么的

我按照这一思路使用了 Copilot,得到的结果很是搞笑:function validateUserJWT(jwt: string): boolean {return true;}除了删除硬盘驱动器之外,这可能是最糟糕的实现了。

7.爱分析的金融男2

这种错误是如此明显、粗陋,任何专业的程序开发者对此都不会有异议我更感兴趣的是 Copilot 是否会生成乍一看很合理的代码,以至于其中的错误会被程序员忽视或被经验不足的程序员认为是正确的(剧透一下:确实会出现这种情况。

8.爱分析的金融男 背景

)我有意使用 Copilot 生成实际应该人工编写的代码,因为用户肯定会在生产过程中这样做不确定性Copilot 是一种生成模型,这意味着其目的是生成在统计学意义上近似其输入(即训练数据)的输出结果其目标并不是精准重现其输入,因为单纯的复现并不需要机器学习系统。

9.爱分析公司权威吗

这类模型有一个通常被称为「温度(temperature)」的参数,这是一个滑动比例,可在保守风格(模仿最常见的输入)和原创风格之间调整原创性设置越高,输出的结构化程度就越低,就越有可能得到垃圾结果Copilot 的温度由 GitHub 控制,据说他们会根据当前试验阶段而对其进行调节。

10.爱分析公司工作怎么样

以同样的方式调用一个生成模型两次,通常并不会得到两个同样的结果它每次都会重新运行一次自己的统计模型这有其优势——如果你不喜欢该模型的前一个建议,你可以再次提问这也能减少 Copilot 为不同用户生成相同代码的数量。

但是,这与可靠性最基本的原则之一(即确定性)并不一致它有可能在某一天完全按照你的样本文件执行,而在第二天又完全做错举个例子,使用完全一样的输入(一个仅包含注释、关键词 “function” 和一个空格的文件),我得到了以下两个不同的月相计算器实现:

月相计算器 A// returns the current phase of the moonfunction getPhase() {var phase = Math.floor((new Date().getTime() – new Date().setHours(0,0,0,0)) / 86400000) % 28;

if (phase == 0) {return “New Moon”;} else if (phase == 1) {return “Waxing Crescent”;} else if (phase == 2) {

return “First Quarter”;} else if (phase == 3) {return “Waxing Gibbous”;} else if (phase == 4) {return “Full Moon”;

} else if (phase == 5) {return “Waning Gibbous”;} else if (phase == 6) {return “Last Quarter”;} else if (phase == 7) {

return “Waning Crescent”;}}月相计算器 B// returns the current phase of the moonfunction getPhase() {var phase = Math.floor((new Date().getTime() – new Date(new Date().getFullYear(), 0, 0).getTime()) / (1000 * 60 * 60 * 24)) + 1;

if (phase > 29) {phase = 29;}return phase;}粗略一看,它们完成的任务好像一样,但其中一个实现会将一个月份分为 8 个月相,每个月相包含若干天,然后返回日期对应的月相文本标签;另一个则像是将每个月份的每一天视为一个不同的月相且没有文本标签。

但实际上它们都做错了计算器 A 说 2021 年 7 月 2 日是新月,而人工编写的天文学网站则表示 2021 年 7 月 2 日是残月计算器 B 则在 phase 值高得离谱(>29)时,将月相设为29。

这两个实现乍一看都是可行的,而如果你比较一些结果,你会发现很难说其中哪一个是正确的实际上,我在生成一个复活节日期计算器时多次得到了完全一样的输出结果,而且这个计算器是正确的(至少在我验证过的一些年份上是正确的)。

我猜想这意味着复活节计算器实现之间的偏差要比月相计算器之间的偏差小得多复活节计算器// calculates the Easter date for a given yearfunction Easter(y) {

var a = y % 19;var b = Math.floor(y / 100);var c = y % 100;var d = Math.floor(b / 4);var e = b % 4;var f = Math.floor((b + 8) / 25);

var g = Math.floor((b – f + 1) / 3);var h = (19 * a + b – d – g + 15) % 30;var i = Math.floor(c / 4);

var k = c % 4;var l = (32 + 2 * e + 2 * i – h – k) % 7;var m = Math.floor((a + 11 * h + 22 * l) / 451);

var n0 = (h + l + 7 * m + 114)var n = Math.floor(n0 / 31) – 1;var p = n0 % 31 + 1;return new Date(y, n, p);

}可解读性上面的复活节计算器是正确的,但我也只是通过实验知道的;它实在太难以解读了(更新:有人在评论区指出有一个书写错误会影响少量年份——这是逃过了我的检验的漏洞!)Copilot 可以并且有时候肯定会增加注释,但在这里没有影响。

其中的变量名也完全毫无用处我毫不怀疑其中一些是没有明确名称的中间结果,但整体而言,它能够做到更加清晰有时候,回到开始从注释的起点开始调用,会让 Copilot 试图给出解释举个例子,在函数中间提示 //f is 会让 Copilot 声明 // f is the day of the week (0=Sunday),但这似乎并不对,因为复活节星期日(Easter Sunday)往往是在星期日。

其还会声明 // Code from http://www.codeproject.com/Articles/1114/Easter-Calculator ,但这似乎并非一个真实网站链接Copilot 生成的注释有时候是正确的,但并不可靠。

我尝试过一些与时间相关的函数,但仅有这个复活节计算器是正确的Copilot 似乎很容易混淆不同类型的计算日期的数学公式举个例子,其生成的一个「格列高利历到儒略历」转换器就是混杂在一起的计算星期几的数学公式。

即使是经验丰富的程序员,也很难从统计学上相似的代码中正确辨别出转换时间的数学公式密钥以及其它机密信息真实的密码学密钥、API 密钥、密码等机密信息永远都不应该发布在公开的代码库中GitHub 会主动扫描这些密钥,如果检测到它们,就会向代码库持有者发出警告。

我怀疑被这个扫描器检测出的东西都被排除在 Copilot 模型之外,虽然这难以验证,但当然是有益的这类数据的熵很高(希望如此),因此 Copilot 这样的模型很难见过一次就完全记住它们如果你尝试通过提示生成它,那么 Copilot 通常要么会给出一个显而易见的占位符「1234」,要么就会给出一串十六进制字符——这串字符乍看是随机的,但基本上就是交替出现的 0-9 和 A-F。

(不要刻意使用它来生成随机数它们的语法是结构化的,而且 Copilot 也可能向其他人建议同样的数字)但是,仍然有可能用 Copilot 恢复真实的密钥,尤其是如果你使用十个而非一个建议打开一个窗格时举个例子,它向我提供了密钥 36f18357be4dbd77f050515c73fcf9f2,这个密钥在 GitHub 上出现了大约 130 次,因为它曾被用于布置家庭作业。

任何在 GitHub 上出现过 100 次以上的东西都不可能是真正敏感的东西最现实的风险是天真的程序员接收自动填充的密码作为加密密钥,这会让所得到的值看起来随机,但其熵却很低很危险通过提示来生成密码会得到各种有趣的不安全样本。

在训练数据中,这些样本通常是作为占位字符串使用的大家最喜欢的占位字符串是「mongoose」对一些用户而言,生成脏话词汇可能会造成一些问题证书清洗GitHub 已经公开表示他们在 Copilot 模型中包含了托管于该网站的所有公开代码,并且不管证书如何。

很明显,他们认为这算是正当使用,不受制于证书限制,但这样的意见在法庭上是否站得住脚…… 还有待观察可以很容易验证,Copilot 包含 GPL 代码,因为 Copilot 可以很容易从记忆中引用 GPL 证书文本。

用 Copilot 写出类似于某些具有独特命名惯例的 GPL 项目的代码也很容易关键在于,Copilot 可用于「证书清洗」,做法是通过提示让其对不想要证书下的代码进行细微的修改对于使用 Copilot 的所有人而言,这有可能突然成为一个大的法律问题,也可能不会成为问题。

安全漏洞示例:用 C 写的 HTML 解析器一位朋友建议使用「具有正则表达式的通用 HTML 解析器」来为 Copilot 提供提示,这恰好是一个你不应该做的例子;Copilot 实际上拒绝使用正则表达式,而是编写了一个完备的 C 函数和相当好的 main() 来驱动它。

我做出的唯一修改是注释掉 free(html),因为 free() 没有通过 include 定义并且在任何情况下都不是必需的#include // general purpose HTML parser with regex

void parse(char *html) {int i = 0;while (html[i] != \0) {if (html[i] == <) {// find the end of the tag

int j = i + 1;while (html[j] != >) {j++;}// find the end of the attributeint k = j + 1;while (html[k] != && html[k] != \0) {

k++;}// copy the tag and attribute to a new stringchar tag[j – i + 1];char attr[k – j + 1];for (int m = 0; m < j – i; m++) {

tag[m] = html[i + m];}tag[j – i] = \0;for (int m = 0; m < k – j; m++) {attr[m] = html[j + m];}attr[k – j] = \0;

printf(“%s %s\n”, tag, attr);// skip the end of the tagi = k;} else {i++;}}}int main(int argc, char *argv[]) {

if (argc < 2) {printf(“usage: %s \n”, argv[0]);return 1;}FILE *fp = fopen(argv[1], “r”);if (fp == NULL) {

printf(“error opening %s\n”, argv[1]);return 1;}char *html = NULL;size_t len = 0;if (getline(&html, &len, fp) == -1) {

printf(“error reading %s\n”, argv[1]);return 1;}parse(html);//free(html); // copilot inserted this but its not declared and not necessary anyway

return 0;}这是格式良好甚至还有注释的 C 代码,它当然看起来像是能解析 HTML,其 main 函数在打开文件时有一些很有用的样板但是,其解析过程有很多问题首先,最重要的是,如果被解析的字符串不包含 >,那么解析器就会直接运行到缓冲区的末端并导致崩溃。

这个解析器完全不清楚单独的 ” 之间的区别,并会直接考虑首先出现的 >,而不会考虑其语法功能属性的定义是紧跟在右括号之后的非空白序列举个例子,在 glory 中,glory 是一个属性。

属性属于它们的标签内部,并且可以有多个以空格分隔的属性没有任何报错能力好消息是其有数量惊人的设计精妙的指针数学,其工作起来就像是…… 之前已经设计好的很难说这是预先设计好的,因为这个函数其实并没有做什么有用的事情,尽管它与基础解析器的功能差不多有 80% 相似。

当然,因为运行到缓冲区末端而直接引发的崩溃是一个致命的安全问题安全漏洞示例:用 PHP 写的 SQL 注入前两行是我的提示

© 版权声明
THE END
喜欢就支持一下吧
点赞0赞赏 分享
相关推荐
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片

    暂无评论内容