深入理解ctx.ctx.typeck_results() .expr_ty_adjusted(arg).is_unsafe_ptr() I
检测unsafe_ptr
1. 源码
ExprKind::Unary(op, arg) => {
let arg_term = self.analyze_expr(ctx, arg, ExprCtx::default());
println!("🚀 arg_term: {:?} 🚀", arg_term);
if *op == UnOp::UnDeref {
if ctx
.ctx
.typeck_results()
.expr_ty_adjusted(arg)
.is_unsafe_ptr()
{
let typeck_results = ctx.ctx.typeck_results();
let adjusted_type = typeck_results.expr_ty_adjusted(arg);
println!("🐋 Adjusted type: {:?} 🐋", adjusted_type);
self.call_graph
.add_unsafe_behavior(&ctx.fn_name, UnsafeBehavior::RawPtrDeref);
}
let ref_term = mk_ref(expr_term.clone().extract_simple(), EmptySet);
println!("🌍 ref_term: {:?} 🌍", ref_term);
self.taint_analysis.add_flow(arg_term.unwrap(), ref_term);
Some(expr_term)
} else {
arg_term
}
},
传入
fn analyze_expr<'a, 'tcx>(
&mut self,
ctx: &AnalysisCtx<'a, 'tcx>,
expr: &'tcx Expr<'tcx>,
expr_ctx: ExprCtx,
) -> Option<Term<Loc<Name>>>
定义
struct AnalysisCtx<'a, 'tcx> {
pub locals: HashMap<Ident, Loc<Name>>,
pub fn_name: Name,
pub ctx: &'a LateContext<'tcx>,
}
ctx
类型:
&AnalysisCtx<'a, 'tcx>
描述:这是一个指向
AnalysisCtx
结构体的引用。这个结构体中包含了进行表达式分析时所需的上下文信息,例如局部变量映射、函数名以及一个称为LateContext
的上下文引用。
ctx.ctx
类型:
&'a LateContext<'tcx>
描述:这是
AnalysisCtx
结构体中的一个字段,它是对LateContext
的一个引用。从你提供的代码中,我们可以推测LateContext
可能是Rust编译器的内部类型,用于存储与类型检查和语义分析有关的上下文信息。
ctx.ctx.typeck_results()
类型:未明确,但这是
LateContext
的一个方法的返回值。描述:这是一个方法的返回值,似乎提供了对当前表达式或项的类型检查结果的访问。从它的名称和如何使用它来看,它可能会返回一个结构体或对象,这个结构体或对象提供了关于表达式的类型信息。
ctx.ctx.typeck_results().expr_ty_adjusted(arg)
类型:未明确,但这是
typeck_results()
返回值的一个方法的返回值。描述:根据它的名称,这个方法似乎返回了调整后的表达式类型。这个“调整”可能是指经过类型推导、协变或其他Rust的类型系统特性后得到的类型。
ctx.ctx.typeck_results().expr_ty_adjusted(arg).is_unsafe_ptr()
类型:很可能是
bool
描述:这是
expr_ty_adjusted(arg)
返回值的一个方法的返回值。从它的名称来看,这个方法返回一个布尔值,表示调整后的表达式类型是否是一个不安全的指针。
综上所述,这些类型和方法都与Rust编译器的内部表示和类型系统有关,尤其是与类型检查和表达式类型的查询有关。