大厂Data+Agent 秘籍:腾讯/阿里/字节解析如何提升数据分析智能。 了解详情
写点什么

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

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

关注

评论

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

【YashanDB知识库】update (子查询) set ORG_ID_STAN -ID 改写

YashanDB

数据库 yashandb

直播效果搭建的神兵利器、音乐制作的全能小将----Studio One

阿拉灯神丁

音频 编曲宿主 StudioOne 音乐制作软件 后期混音效果全套插件

2024-12-21:从魔法师身上吸取的最大能量。用go语言,在一个神秘的地牢里,有 n 名魔法师排成一列。每位魔法师都有一个能量属性,有的提供正能量,而有的则会消耗你的能量。 你被施加了一种诅咒,吸

福大大架构师每日一题

福大大架构师每日一题

《计算机组成及汇编语言原理》阅读笔记:p1-p8

codists

计算机组成及汇编语言原理

探索C#中Task与CancellationTokenSource的协同艺术

代码忍者

淘宝天猫API接口深度解析:商品详情与关键词搜索商品的高效应用与实战代码

代码忍者

淘宝API接口 淘宝评论API

阿里巴巴1688 API接口详解:商品详情与关键词搜索商品的高效应用与实现

代码忍者

1688API接口 关键词搜索1688API

淘宝电商运营的小秘籍,看完血赚。

科普小能手

运营 淘宝 技巧 电商 运营干货

Flink 2.0 存算分离状态存储 — ForSt DB

Apache Flink

大数据 flink 实时计算 数据处理 存算分离

【连载 06】自定义线程池(下)

FunTester

DeFi即将迎来大爆发:2025年金融变革的背后逻辑与机会

chainwiseweb3

DeFi质押挖矿 DeFi流动性挖矿 defi开发 defi金融开发 去中心化合约开发

【YashanDB知识库】复合索引下in大量参数查询性能慢

YashanDB

数据库 yashandb

不同价位的LED显示屏,都有什么差别?

Dylan

LED显示屏 全彩LED显示屏 户外LED显示屏 led显示屏厂家

【YashanDB知识库】Oracle pipelined函数在YashanDB中的改写

YashanDB

数据库 yashandb

数据云平台的可观测性

奇点云

【YashanDB知识库】XMLAGG方法的兼容

YashanDB

数据库 yashandb

Cyber Triage 3.13 发布,新增功能概览

sysin

数字取证

【YashanDB知识库】YMP迁移过程中报错YAS-02143或YAS-02193

YashanDB

数据库 yashandb

金融保险行业数字化创新实践:如何高效落地自主可控的企业级大数据平台

tapdata

大数据平台 数据集成 数据服务 实时数据集成 银行保险业数字化转型

Anthropic 工程师关于提示词工程的深入探讨

亚马逊云科技 (Amazon Web Services)

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