深入理解ctx.ctx.typeck_results() .expr_ty_adjusted(arg).is_unsafe_ptr() I

·

1 min read

检测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
                }
            },
  1. 传入

    fn analyze_expr<'a, 'tcx>(
        &mut self,
        ctx: &AnalysisCtx<'a, 'tcx>,
        expr: &'tcx Expr<'tcx>,
        expr_ctx: ExprCtx,
    ) -> Option<Term<Loc<Name>>>
  1. 定义

struct AnalysisCtx<'a, 'tcx> {
    pub locals: HashMap<Ident, Loc<Name>>,
    pub fn_name: Name,
    pub ctx: &'a LateContext<'tcx>,
}
  1. ctx

    • 类型:&AnalysisCtx<'a, 'tcx>

    • 描述:这是一个指向AnalysisCtx结构体的引用。这个结构体中包含了进行表达式分析时所需的上下文信息,例如局部变量映射、函数名以及一个称为LateContext的上下文引用。

  2. ctx.ctx

    • 类型:&'a LateContext<'tcx>

    • 描述:这是AnalysisCtx结构体中的一个字段,它是对LateContext的一个引用。从你提供的代码中,我们可以推测LateContext可能是Rust编译器的内部类型,用于存储与类型检查和语义分析有关的上下文信息。

  3. ctx.ctx.typeck_results()

    • 类型:未明确,但这是LateContext的一个方法的返回值。

    • 描述:这是一个方法的返回值,似乎提供了对当前表达式或项的类型检查结果的访问。从它的名称和如何使用它来看,它可能会返回一个结构体或对象,这个结构体或对象提供了关于表达式的类型信息。

  4. ctx.ctx.typeck_results().expr_ty_adjusted(arg)

    • 类型:未明确,但这是typeck_results()返回值的一个方法的返回值。

    • 描述:根据它的名称,这个方法似乎返回了调整后的表达式类型。这个“调整”可能是指经过类型推导、协变或其他Rust的类型系统特性后得到的类型。

  5. ctx.ctx.typeck_results().expr_ty_adjusted(arg).is_unsafe_ptr()

    • 类型:很可能是bool

    • 描述:这是expr_ty_adjusted(arg)返回值的一个方法的返回值。从它的名称来看,这个方法返回一个布尔值,表示调整后的表达式类型是否是一个不安全的指针。

综上所述,这些类型和方法都与Rust编译器的内部表示和类型系统有关,尤其是与类型检查和表达式类型的查询有关。