菲洛嘉青春动能素135HA FILLMED® NCTF 135HA LED指示灯的常见故障分析 智微智能 Elkhartlake K075终端,零售产业新选择 天空蓝拓客管理系统详细介绍版 muso公链项目 天使计划 是什么?[秘] 独家揭秘最前沿的家装“黑科技”——掌赋 天博体育欧洲杯特辑,东道主法兰西的失意2016 亚马逊的送货侦察员 学习听起来像挡泥板 Google Comics Factory使ML变得容易 笑着说-男性或女性 Amazon Rekognition中更好的人脸检测 关于Spaun的真相-大脑模拟 两个聊天机器人彼此聊天-有趣又怪异 GANPaint:将AI用于艺术 WCF和WF给予社区 从耳朵到脸 所有神经网络的深层缺陷 蠕虫在尾巴上平衡杆子 Kickstarter上的OpenCV AI套件 TensorFlow-Google的开源AI和计算引擎 众包取代新闻工作者 Google的DeepMind学会玩街机游戏 哑机器人V智能机器人 .NET与.NET 5融为一体 Google的深度学习-语音识别 LInQer将.NET LINQ移植到Javascript 机器人TED演讲-新的图灵测试? GAN的发明者加入苹果 您的智能手机会监视您键入的内容 人工智能帮助改善国际象棋 Zalando Flair NLP库已更新 TensorFlow 1.5包含移动版本 AlphaGo输了一场比赛-比分3-1 虚拟机器学习峰会 Microsoft开源AI调试工具 SharePoint走向移动 F#4.0发出文化变革的信号 克里斯蒂拍卖AI艺术品 人工智能如何区分 Facebook在蒙特利尔的新AI实验室 Mozilla想要您的声音 微软使用极深的神经网络赢得ImageNet 建立AI合作伙伴关系 .NET Core 3-Microsoft几乎回到了起点 神经网络-更好的销售商? Google使用AI查找您的住所 虹膜-适用于Android的Siri证明苹果没有优势 TensorFlow 2提供更快的模型训练 深度学习研究人员将为Google工作
您的位置:首页 >前端 >

Microsoft使C安全-已检查C

众所周知,C给您带来了很大的自由度,很容易犯大错。通常,调用是放弃C并采用更现代的功能,例如Rust,但是为什么不添加C以使其安全呢?

微软已经用JavaScript完成了,那么为什么不使用C?TypeScript将JavaScript作为子集,但是可以说它是一种更好的语言。为什么不对C做同样的事情,并挽救该语言和其中编写的许多程序?

经营者

这不是Checked C的目的。这不是纠正语言的第一次尝试,但是Microsoft Research在华盛顿大学的Archibald Samuel Elliott,马里兰大学的Andrew Ruef和Michael Hicks的新论文中对此进行了推广。 ;以及Microsoft Research的David Tarditi。该语言的历史比建议的历史悠久,它于2016年开源。

基本思想是引入新的指针类型以及程序的选中和未选中区域的概念。两种新的指针类型是_Ptrtype和_Array_ptrtype-区别在于数组指针允许指针算术,而原始指针则不允许。原始编译器在取消引用时检查新指针是否有效。

数组指针是经过边界检查的,但是如果可以推断出不能超出边界,则编译器将删除该检查。

在C的其他改进版本中,指针与边界一起存储。在Checked C中,放置一个bounds表达式,指示边界的保留位置。例如:

void append(_Array_ptr <char> dst:count(dst_count),_ Array_ptr <char> src:count(src_count),size_t dst_count,size_t src_count){_Dynamic_check(src_count <= dst_count); for(size_t i = 0; i <src_count; i ++){if(src [i] ==‘/ 0’){break;} dst [i] = src [i]; }}

有很多不同的方法来指定数组边界,您将必须学习如何最好地使用它们,并且必须将它们添加到现有代码中。

还有一个新的检查数组类型:

int buf _Checked [10];

以及处理空终止数组(即字符串)的类型。

这种方法与TypeScript中使用的渐进类型注释的想法并无不同。将代码段标记为未选中的功能也有助于“渐进”的改进方法。在C的未检查部分中,您可以执行任何您喜欢的事情,并且检查中没有编译。如论文所述,这可能不是100%安全的,但至少它突出了代码的不安全部分。

Checked C还执行了许多其他检查,以确保指针没有危险。特别是,变量必须初始化。在边界中使用变量和结构的地址也有限制。

对C进行任何修改的问题在于效率是最重要的,而添加C往往会使事情变得越来越慢。目前,Checked C仅可用作Clang / LLVM的扩展。该编译器在两个指针基准库上进行了测试。使代码安全的更改占行的17.5%左右。这些更改大部分是声明,初始化程序等;没有改变核心逻辑。平均而言,只有不到10%的代码不安全-令人惊讶的是,由于使用了可变参数printf语句。平均运行时开销为8.6%,与其他尝试“安全” C的尝试相比是不错的选择,但是对于真正关键的代码,您仍然可能必须使用未经检查的部分。

本文的结论是:

我们介绍了Checked C,它是C的扩展,有助于确保空间安全。Checked C的设计侧重于与传统C的互操作性,可用性和高性能。程序的任何部分都可以包含并受益于选中的指针。此类指针与传统的非检查指针二进制兼容,但具有显式注释和强制执行的边界。标注为选中区域的代码单元可确保安全性:其中的代码可能不会使用未经检查的指针或不安全的强制转换,否则可能会导致违反空间安全性。选中的C的边界安全接口将选中的类型提供给未选中的代码,这对于改进第三方库和标准库很有用。这些功能加在一起,可以逐步为旧版程序增加安全性,而不是使其成为一个无所不能的主张。我们将Checked C作为LLVM扩展的实现具有良好的性能,并且运行时和编译开销相对较低。它可以从https://github.com/Microsoft/checkedc免费获得,并将继续积极开发。

被检查的C在边界检查方面做了很多工作,但是C仍然遭受行为未定义的根本问题,并且在以某种方式解决之前,就“高级”语言而言,它是不安全的。

经营者

郑重声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,多谢。