2 个版本
使用旧的 Rust 2015
0.1.1 | 2018年6月19日 |
---|---|
0.1.0 | 2018年3月9日 |
#557 in Cargo 插件
9KB
99 行
cargo-osha
Cargo 插件,用于列出 Rust 项目的 unsafe 代码。目前主要是一个概念验证。
实际上还不是 Cargo 插件。
示例
示例来自 winit
,一个执行大量平台特定 FFI 的 crate
> cargo run -- winit/src/**.rs
...
Unsafe functions: 20/85
Unsafe expressions: 222/16847
Unsafe traits: 0/14
Unsafe methods: 14/460
Unsafe impls: 21/136
示例来自 ggez
,一个主要使用提供安全包装的依赖项的 crate,因此自身需要很少的 unsafe 代码
> cargo run -- ggez/src/**.rs
...
Unsafe functions: 0/101
Unsafe expressions: 0/6786
Unsafe traits: 0/7
Unsafe methods: 0/312
Unsafe impls: 1/122
使用方法
目前它只提供了一个简单的命令行程序,该程序读取 N 个 Rust 源文件。不会遍历依赖项或任何东西,您必须通过命令行提供所有文件。它没有任何值得提及的命令行标志。
代码本身几乎微不足道,只需阅读源代码。它使用 syn
遍历 Rust 源代码文件并计算在不同位置出现的 unsafe
的次数。可能有一些它没有计算到的,只需打开一个问题或类似的事情。
将来可能将其分割成库。
关于 unsafe
unsafe 块内部的代码行数并不是一个有用的估计。
-- /u/kibwen
我认为任何形式的计数都无法有所帮助。
-- /u/DGolubets
unsafe 不是你的敌人。unsafe 是你的朋友...你知道,那个住在乡村并且有一个巨大的皮卡和37把枪的朋友。你可能不会把他带到你妹妹的婚礼上,但如果你需要爆炸某物,他就在那里为你服务。
-- 我
这个工具的目的不是“测量不安全性”,而是作为一个快速且不完美的调查,因为部分信息比没有信息要好。Reddit 上的 /u/annodomini
说的最好
它是一个进行初步概述的快速指标,而不是代替进行适当的审计。
查看线程中其他地方发布的 cargo-osha 的输出,actix-web 中有 1025 个 unsafe 表达式,总共有 37602 个。这告诉我,仅仅为了确定那些 1025 个 unsafe 表达式需要应用哪些不变量,就需要做大量的审计工作,更不用说审计那些 unsafe 代码所依赖以维护这些不变量的隐私边界内的代码了。
如果一个crate有两个或三个不安全的表达式,这告诉我审计这些表达式可能相对较快,找出它们依赖的不变量,然后审计代码库中可能影响这些不变量的所有内容;例如,如果它依赖于长度和容量的不变量,那么您只需审计那些涉及长度和容量的内容。或者在某些情况下,不安全的代码实际上不依赖于任何其他的不变量,可以独立审计。
另一方面,如果您有1025个不安全的表达式,审计所有这些以及可能影响这些表达式是否有效的所有内容是一项巨大的工作。
为什么叫这个名字?
在美国,OSHA(职业安全和健康管理局)是负责工作场所安全的政府机构。他们的工作是确保建筑工人戴安全帽,矿工不吸入石棉,工厂工人不被机器压伤,所有这些有用的东西。OSHA的工作几乎是不可能的,因为他们如果完美地完成这项工作,那么任何事情都不会完成,但世界因为他们的存在而变得更好。
为世界各地的人对此名称的晦涩表示歉意!
依赖项
~2.5MB
~52K SLoC