写点什么

扩展 LLVM 的 Checked C 使 C 语言的空间内存更安全

  • 2018-09-17
  • 本文字数:1108 字

    阅读完需:约 4 分钟

Checked C 是由 Microsoft Research 组织开发的开源、合作项目,它的目标是扩展C 语言,方便程序员写出更为可靠的程序,不会出现类似缓存溢出、越界内存访问以及不正确的类型转换等问题。Checked C 的代码可以和标准C 代码共存,方便移植。

即将在IEEE Cybersecurity Development Conference 2018 上发表的一篇文章中,研究员介绍了 Checked C 主要的功能和优势

Checked C 借鉴了许多之前 safe-C 的想法,但是二者有所不同,Checked C 的设计重点在允许增量转换的同时平衡控制、互操作以及高性能。

该语言非常重视向后兼容性,它引入了检查指针的概念,来保证静态和动态访问验证。Checked C 语言尤其重视内存访问的空间安全问题,这代表着指针在分配的内存中始终是解引用的。Checked C 的三个设计重点如下所示:

  • C 指针表示得到了保留,所以 Checked C 的内存层与 C 相同。这有助于现存 C 代码库和库的互操作性。

  • 显式指明分配给指针的内存块边界,降低了编译时和运行时的负担。

  • 检查区域和边界安全接口让 Checked C 和原来的 C 代码的混合变成可能。完全移植过的代码将放在称为检查区域的 sp 中,在其中每个指针的访问都不会受到空间内存异常的限制。检查过的代码可以访问不安全的遗留 C 代码,这将通过边界安全的注解实现,这些注解将会添加到未检查的代码参数、返回值、功能、记录类型和全局变量中。

Checked C 给 C 语言添加了两个新的指针类型,_Ptr 和 Array_ptr。前者专门用于解引用,而后者支持指针运算。在解引用之前,编译器将动态地保证这两类指针的有效性。下面的例子展示了如何定义使用两个 _Array_ptr参数的功能:

复制代码
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];
}
}

在创建数组的时候,程序员可以使用 _Checked 关键字指定检查边界:

int buf _Checked[10]根据 Checked C 开发者所述,要让现有的 C 代码转换为使用检查指针和数组的代码需要很多代码变更工作,可能会影响大概 17.5% 行代码。为了加快进程,团队正在开发自动转换的工具。有趣的是,Checked C 部分形式化的特点可以保证任何违背空间安全的动作都将隔离在检查区域之外。今后这一方面的努力方向将扩展到动态大小数组上。

最后需要提出的是,初步基准测试显示,检查行为增加了平均 8.6% 的运行时间。Checked C 是作为 LLVM 的扩展实现的,可以点击这里下载。

查看英文原文 Checked C Extends LLVM to Bring Spatial Memory Safety to C

感谢冬雨对本文的审校。

2018-09-17 15:171611
用户头像

发布了 218 篇内容, 共 78.8 次阅读, 收获喜欢 76 次。

关注

评论

发布
暂无评论
发现更多内容

JVM C1、C2编译器

FunTester

服务器集群技术有哪几种类型

Geek_f19a80

服务器

DDD学习与感悟——总是觉得自己在CRUD怎么办? | 京东云技术团队

京东科技开发者

架构 DDD 软件设计 curd

Dapp燃烧铸币模式系统开发丨智能合约技术开发

l8l259l3365

喜讯!华秋荣获2023中国产业数字化百强榜企业

华秋电子

GPU深度学习性能的三驾马车:Tensor Core、内存带宽与内存层次结构

Baihai IDP

人工智能 程序员 AI gpu LLM

一次讲清楚京东科技百亿级用户画像平台的探索和实践 | 京东云技术团队

京东科技开发者

数据库 Clickhouse 用户画像 用户画像平台

法律情境扮演、逆向推理文字游戏、AIGC创作……见证AI极致生产力!

飞桨PaddlePaddle

人工智能 AIGC

拼版不合理案例详解

华秋电子

深入理解HarmonyOS UIAbility:生命周期、WindowStage与启动模式探析

华为云开发者联盟

鸿蒙 操作系统 华为云 HarmonyOS 华为云开发者联盟

对标世界一流!用友已与74家中央企业达成集团级合作!

用友BIP

【FAQ】运动健康服务端侧数据常见问题及解答

HarmonyOS SDK

HMS Core

三层开发

Geek_8da502

APP开发

走进厦航,体验智能会计时代的业财融合

用友BIP

智能会计 业财融合

08 | 栈:如何实现浏览器的前进和后退功能

鲁米

关于Nuxt.js 服务端组件的使用

秃头小帅oi

细说GaussDB(DWS)的2种查询优化技术

华为云开发者联盟

数据库 后端 华为云 华为云开发者联盟 华为云GaussDB(DWS)

一键自动修改和翻新OC源码,解决苹果审核4.3和马甲问题

【高效视频处理】体验火山引擎多媒体处理框架 BMF

数字扫地僧

BMF

如何实现高效代码审查,赋能大规模开发

龙智—DevSecOps解决方案

代码审查

Tomcat 配合虚拟线程,一种新的编程体验

越长大越悲伤

Java springboot 虚拟线程

2024深圳电子展,加快粤港澳电子信息发展,重点打造湾区经济

AIOTE智博会

电子展 深圳电子展 电子信息展 电博会

HarmonyOS振动效果开发指导

HarmonyOS开发者

HarmonyOS

07 | 链表(下):如何轻松写出正确的链表代码?

鲁米

Amazon CodeWhisperer 正式发布可免费供个人使用

亚马逊云科技 (Amazon Web Services)

人工智能 Amazon Lambda 云上探索实验室 Amazon CodeWhisperer Amazon Cloud9

给 Web 前端工程师看的用 Rust 开发 wasm 组件实战 | 京东云技术团队

京东科技开发者

rust 前端 webassembly 前端组件

用友与厦国会联合培训,探索智能会计时代业财融合成功模式

用友BIP

智能会计

重磅签约!美团携手用友推进数智化升级

用友BIP

企业数智化

京东面试:说说Cookie、Session和Token的区别?

王磊

Java 面试

MYSQL EXPLAIN 执行计划 | 京东物流技术团队

京东科技开发者

MySQL 数据库 EXPLAIN EXPLAIN执行计划

扩展LLVM的Checked C使C语言的空间内存更安全_语言 & 开发_Sergio De Simone_InfoQ精选文章