写点什么

扩展 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:171210
用户头像

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

关注

评论

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

JVM架构解析

沃德

Java 程序员 7月月更

用 Flutter 来一颗跳动的心

岛上码农

flutter ios 前端 安卓开发 7月月更

想通讯?谈钱多俗,谈ProtoBuf

怀瑾握瑜的嘉与嘉

protobuf 7月月更

数据湖基本架构

五分钟学大数据

数据湖 7月月更

【漫步刷题路】- 逆序字符串II

芒果酱

7月月更

把项目打包成docker镜像,并发布到腾讯云?DockerHub!

为自己带盐

Dockerhub 7月月更 dotnetcore

数据库每日一题---第24天:格式化部门表

知心宝贝

数据库 算法 前端 后端 7月月更

Block的底层实现

NewBoy

ios 前端 移动端 iOS 知识体系 7月月更

因果学习将开启下一代AI浪潮?九章云极DataCanvas正式发布YLearn因果学习开源项目

九章云极DataCanvas

人工智能 GitHub 开源项目 因果学习 YLearn

中台建设利器-SPI插件机制

Man

中台 插件化

查找——二叉排序树(二)

乔乔

7月月更

【MySql项目实战优化】通过执行计划分析追加索引

安逸的咸鱼

MySQL 实战案例 7月月更

三级分类的数据表设计和构造API数据

宁在春

spring-boot 树形选择器 7月月更 菜单管理

【LeetCode】前缀和后缀搜索Java题解

Albert

LeetCode 7月月更

Serverless模板重磅上线!多场景覆盖、小时级快速集成

最新动态

Linux Lab 会议或直播安排与记录

贾献华

7月月更

String 实现模糊查询

小肉球

qt 7月月更

【刷题记录】12. 整数转罗马数字

WangNing

7月月更

mysql进阶(四)聊聊mysql中的事务锁机制

No Silver Bullet

MySQL 7月月更

【古月21讲】ROS入门系列(3)——客户端Client、服务器Server的编程实现+自定义服务数据编程实现

秃头小苏

ROS 7月月更

接口测试——流程测试支持批量参数导入,测试效率直接拉满

Xd

Java 数据库 程序员 接口测试工具

曾经辉煌一世的流媒体协议RTMP是什么样的?它能完全被取代吗?一文带您走进RTMP的世界

wljslmz

RTMP 7月月更 流媒体协议

【愚公系列】2022年07月 Java教学课程 05-关键字

愚公搬代码

7月月更

数据库与开源的未来

CnosDB

IoT 时序数据库 开源社区 CnosDB infra

第1章:初识数据库与MySQL----MySQL安装

乌龟哥哥

7月月更

极限实验室上新啦,期待已久的 INFINI Console 最新的 0.3 版本正式发布!

极限实验室

elasticsearch security console infini alerting

SAP Fiori Launchpad 上看不到任何 tile 应该怎么办?

汪子熙

JavaScript SAP SAP UI5 ui5 7月月更

自建个性化自动报价系统,应对多变报价模式

明道云

@Conditional条件装配

急需上岸的小谢

7月月更

解决问题的最佳实践路径

老张

解决问题 思考实践

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