如何对Rust程序执行过程间分析以检测非安全性问题
Rust项目非安全性扫描的问题与技术需求
我正在扫描Rust项目中的*非安全性(unsoundness)*问题,已取得一定进展,但遇到了技术瓶颈。以下是一个典型的问题代码示例:
pub struct HeaderView { pub inner: *mut htslib::bcf_hdr_t, } impl HeaderView { pub fn new(inner: *mut htslib::bcf_hdr_t) -> Self { HeaderView { inner } } #[inline] fn inner(&self) -> htslib::bcf_hdr_t { unsafe { *self.inner } } /// Get vector of sample names defined in the header. pub fn samples(&self) -> Vec<&[u8]> { let names = unsafe { slice::from_raw_parts(self.inner().samples, self.sample_count() as usize) }; names .iter() .map(|name| unsafe { ffi::CStr::from_ptr(*name).to_bytes() }) .collect() } }
非安全性问题分析
在这个案例中,samples函数的风险根源在于inner函数的非安全性实现:
inner函数直接解引用原始指针,属于Rust中的unsafe操作,但未对指针有效性做任何校验- 用户可通过公开的
new函数或inner字段传入空指针创建HeaderView实例,调用inner函数会直接触发未定义行为(UB)
当前困境与技术需求
目前仅能扫描公开(pub)函数(如samples),但无法系统性识别inner这类非公开的非安全性函数。计划为Rust构建*过程间控制流图(ICFG)*来执行过程间分析,但面临以下疑问:
- 工具选型:LLVM层面的分析会丢失Rust特有的
unsafe标记信息,且未找到成熟的MIR层面过程间分析工具 - 源码内联:如何通过内联Rust源码的方式,解决跨函数分析的难题
内容的提问来源于stack exchange,提问作者廖文昭
相关产品推荐
相关产品推荐

