
TrapC 扩展承诺能够将遗留的 C 代码重新编译为可执行文件,这些可执行文件在设计上是安全的,并且默认情况下是安全的,只需最少的代码重构。
建筑学 云原生生态系统 容器 数据库 边缘计算 基础设施即代码 Linux 微服务 开源 联网 贮存 工程 人工智能 人工智能工程 API 管理 后端开发 数据 前端开发 大型语言模型 安全 软件开发 WebAssembly 运营 AI运营 持续集成/持续交付 云服务 DevOps Kubernetes 可观察性 运营 平台工程 编程 C++ 开发人员工具 去 Java JavaScript 编程语言 Python 锈 TypeScript 渠道 播客 电子书 活动 通讯 TNS RSS 源 新堆栈 关于我们 / 联系我们 赞助商 与我们一起做广告 贡献
C++ / 编程语言 内存安全 C:TrapC 向 C ISO 工作组提出的建议 TrapC 扩展承诺能够将遗留的 C 代码重新编译为可执行文件,这些可执行文件在设计上是安全的,并且默认情况下是安全的,只需最少的代码重构。 2025 年 3 月 12 日上午 7:00,作者: David Cassel 特色图片:内存安全 C:TrapC 向 C ISO 工作组推介 特色图片来自 Pixabay。 摘自 Rowe 的论文。飞涨 摘自 Rowe 的论文。
两周前,C 编程语言国际标准化工作组听取了企业家Robin Rowe提出的 TrapC 提案,这是C 编程语言的一个突破性的内存安全扩展。
“演讲结束后,有人告诉我应该要求更多时间,”罗威在接受 TNS 的电子邮件采访时表示,“30 分钟是不够的。所以,是的,大家很感兴趣。”
Rowe 的扩展将与现有的 C 代码“高度兼容”,甚至与 C++“一定程度兼容”,为世界上现有的大量内存不安全代码库提供了另一种前进的方向。
根据Rowe 提出的白皮书,最终目标是“通过很少的代码重构,将遗留的 C 代码重新编译为设计安全、默认安全的可执行文件”。
过去几年, C 和 C++ 编程语言都受到了严格审查,因为它们允许开发人员无意中编写出带有内存错误的程序,这些错误的代码允许恶意用户用他们自己的恶意代码覆盖内存块。TrapC 可以杜绝这类错误。

TrapC 的设计原理 为了实现这一切,Rowe 领导着 Fountain Adobe,这是华盛顿特区附近的一家非盈利研究机构,成立于 11 月,旨在“维护 TrapC 语言规范和发布免费的开源 TrapC 编译器”,Rowe 告诉我,该非盈利机构“已获得今年剩余时间的资金”,但欢迎企业赞助继续开发。
Rowe 在电子邮件中证实,目前已经有一款编译器可以从标准 C 代码生成 x86、x64 或 ARM 可执行文件,他们现在正致力于支持 TrapC 的其他语言扩展。(他们正在添加关键字trap以提供默认安全的错误处理和别名,以便轻松实现运算符和类型重载,同时重用 C++ 代码安全功能,如构造函数、析构函数、new和成员函数。)
TrapC 确实删除了两个 C 关键字:goto和union,它将其描述为“不安全且已被广泛弃用”。 (后来白皮书建议使用这些关键字的 C 代码可以保存在 C 代码库中,然后由 TrapC 项目链接到...)但人们对即将推出的语言的前景和潜力越来越兴奋...

《Register》写道:“C 和 C++ 程序员可能根本不需要学习 Rust 来参与推动内存安全。”
安全与性能
周六,Rowe 告诉我,“TrapC 有望在 2025 年发布”。他还承诺,“当演示内容足够多时,我们会将其放到网上,这样任何人都可以尝试 TrapC。”

这是一个雄心勃勃的项目。Rowe 曾将 TrapC 的目标描述为“让 C/C++ 软件在语言层面上无法被破解,编写出不会被意外行为利用且永远不会崩溃的软件。”
但有特定的技术可以实现这一点。
据Register报道,Rowe 在 ISO C 标准机构会议上表示:“使用 TrapC 编译器编译 C 代码时,所有指针都将成为内存安全指针并经过检查。”在 TrapC 中,编译器会确定哪些指针可以越界 — — 并将其设置为零。
根据白皮书,这样做的一个结果是,TrapC 指针“始终指向有效内存”并且“不会溢出或包含垃圾”。由于 TrapC 知道(并监视)缓冲区大小,因此它知道错误代码何时“会试图触碰空终止符后的无效内存”。
但这也能带来性能提升吗?“与 C 编译器不同,TrapC 编译器对其指针所保存的内存区域有完美的信息,”Rowe 告诉我——这意味着它可以更好地进行优化。TrapC 编译器无需逐一检查每个指针访问,“而是可以通过使用 AI 代码推理来避免大多数内存安全指针边界检查。”
这让他得出了一个颇具挑衅性的结论。“专家认为内存安全的成本很高,”Rowe 告诉我,“但这一定是真的吗?”最终,TrapC 的编译代码可以更小、更快,Rowe 告诉我——这意味着在计算性能成本时,TrapC 内存安全“可能比免费更好……”
性能增强也可能来自其他 TrapC 语言功能。例如,一些编程语言有一个try关键字,如果尝试失败,它会抛出错误,从而导致该异常的代码分支。但白皮书指出,“对于 TrapC,引用星球大战中的尤达,‘没有尝试,只有做或不做’。”
int main()
{
gets_input();
trap { puts("ERROR: invalid input");
return 1;
} return 0;
}
view rawTrapc.c hosted with ❤ by GitHub 从无错误函数调用返回只会跳过错误处理陷阱代码块。本文承认这是一种在 C 或 C++ 中找不到的新语法。
因此与 C 不同,TrapC 通过终止并显示有用的错误消息来应对缓冲区溢出(和其他错误)。
虽然这听起来只是一个小小的改变,但 Rowe 告诉我,TrapC“陷阱”错误处理机制“在时间和空间上都比 C 或 C++ 异常中现有的任何错误处理机制都要好”。
更多安全改进 Rowe 的白皮书中包含了一个代码示例,该代码通常会导致缓冲区溢出错误,但 TrapC 却以“有用的错误消息”终止程序。
inline
void gets_input()
{ char buffer[24];
printf("Please enter your name and press <ENTER>\n");
gets(buffer):// TrapC will terminate on overrun!
printf("%s", buffer);
}
view rawTrapC-Termination.c hosted with ❤ by GitHub 但论文补充道,对于任何其他意外的错误情况(例如,除以零错误),情况也是如此——除非程序员明确创建自己的捕获错误处理程序。
白皮书还指出了TrapC的其他几个安全功能:
为了避免常见错误,TrapC 提供了许多现代语言中都有的自动内存管理。 虽然 C 也可以通过附加到字符串来触发缓冲区溢出,但“TrapC 字符串会扩展”。 当使用说明符“{}”时, TypeC 在printf语句中提供自动类型检查,即printf("{}",var);。 “TrapC printf()和scanf()是类型安全的、可重载的,并且内置了 JSON 和本地化支持。” TrapC 还具有其他标准C POSIX 库函数的“包装器”函数。 C 编程语言包含一个free()关键字,用于释放内存 — 如果指针随后访问该位置,则可能产生错误。但由于 TrapC 的内存管理是自动进行的,因此这从来都不是问题,该论文解释道。因此“为了与 C 兼容,在 TrapC 中调用free()是可以的,但它会被忽略。”
int main()
{ int* p = malloc(sizeof(int));
free(p);//TrapC ignores free, p not freed yet
*p = 10;//UB in C, no problem in TrapC
return 0;//Leaving Scope, TrapC now frees p automatically
}
view rawtrap_free.c hosted with ❤ by GitHub TrapC“具有基于整数的‘十进制’定点数据类型,适用于金融交易” 白皮书还补充道,未来TrapC甚至可能会尝试添加线程安全功能来帮助防止竞争条件。 简而言之,TrapC“是一种从 C 语言中衍生出来的编程语言,经过修改后,使其具有 LangSec 和 Memory Safe 功能”,该论文总结道。“为了实现这一点,TrapC 致力于消除 C 语言编程语言中的所有未定义行为……”
由人工智能驱动的 IDE? 2024年3月,Rowe还创立了一家名为TRASEC的营利性初创公司,致力于生成式AI编程技术。
Rowe 告诉 TNS:“到目前为止,资金都来自朋友和家人”,并补充说他正在“与风险投资家们交谈”。
TRASEC 正在帮助开发 TrapC 编译器,但这只是一个开始。白皮书称,这家初创公司还希望最终发布一款具有AI 代码推理功能的trapc 网络安全编译器——并计划在 2025 年的某个时候实现这一目标。
正如 Rowe向Register透露的那样,“我们的商业计划是将编译器作为免费开源软件提供,并将 AI IDE 作为付费产品。”
他的最终目标是“让人工智能创造出无法被黑客攻击、无法崩溃的软件”,Rowe 今年 1 月在 Reddit 的“企业家”子版块回答问题时说道。
“在现实世界中,生成式人工智能在编写 Python 代码方面取得了长足进步,”Rowe 告诉我,但它在编写 C 代码方面仍然“不太擅长”。但如果人工智能生成的代码组织得如此井然有序,以至于它能够为“模块化”编程提供全面支持,应用程序的所有单独功能都整齐地隐藏在单独的文件中,那会怎样呢?Rowe 建议,甚至可以自动生成单元测试:“带有单元测试的模块化代码,而不是意大利面条式代码。”
因此与 C 不同,TrapC 通过终止并显示有用的错误消息来应对缓冲区溢出(和其他错误)。
他也在致力于此。Rowe 的白皮书指出,C 目前没有标准化的构建系统作为语言本身的一部分(如 Rust 的 Cargo 工具链)。因此展望未来,“对于 TrapC 来说,拥有一个像 Rust 一样可移植、易于使用的工具链至关重要,这样程序员就可以快速轻松地创建跨操作系统的构建系统。”
幸运的是,Rowe 已经拥有一个用于生成cmake构建文件的工具链,这是他为长期运行的(开源)图形软件项目CinePaint创建的。Rowe 领导了 GNU 图像处理程序(或 GIMP)的开源分支,并告诉我“GIMP 维护者放弃好莱坞分支 GIMP(后来更名为 CinePaint)的原因是它有太多错误。可以说,用 C 编写的 CinePaint 中很难删除内存错误,这给了我创建 TrapC 的经验和动力。”
此外,它还为他提供了一个定制的工具链,不仅可以生成 cmake 文件的代码,还可以生成类、应用程序代码甚至单元测试的样板代码。(Rowe 的论文指出,它甚至可以“追溯用于可能缺乏构建系统的现有项目。”)
论文中称:“Cmaker 目前支持 C++”,但“即将推出对 C 和 TrapC 的支持。”
兼容性和性能 Rowe 的演示文稿中的一张幻灯片承认 TrapC“保留”了 C 的简约性 — — 这意味着它不提供 C++ 版本的模板、异常、函数重载、继承或多态性。
“C 程序员告诉我,内存安全语言要想成为可接受的替代语言,就必须具备 C 兼容性和高性能,”Rowe 在我们的电子邮件采访中解释道。“放弃 C 语言的内存安全性是 20 世纪 70 年代做出的设计妥协。在性能、普及性和安全性之间做出设计选择非常艰难——只能选两个。我的 TrapC 任务是三者兼而有之。
“与 C 高度兼容,并且与 C 中的手动内存管理相比,内存安全性无需花费任何成本。”
C 和 Trapc 的比较图表飞涨
无论其存在什么缺点,Rowe 的演示文稿中的最后一张幻灯片明确指出 TrapC“保护了 C/C++ 指针、scanf、printf和malloc 的安全”。
其中包括一份看似 TrapC 的使命宣言。“强化遗留代码:将普通的 C/C++ 代码编译成不会缓冲区溢出、不会崩溃的程序。”

评论