CTF-web: 查看rust代码抽象语法树

查看 Rust 抽象语法树(Abstract Syntax Tree, AST)是理解 Rust 代码结构和编译过程的重要步骤。

首先,安装 Nightly 工具链

bash 复制代码
rustup install nightly

然后可以查看rust文件抽象语法树

powershell 复制代码
rustc +nightly -Zunpretty=ast-tree file.rs

示例1

rust 复制代码
fn main() {  
    println!("Hello, world!");  
}
rust 复制代码
Crate {
    attrs: [],
    items: [
        Item {
            attrs: [],
            id: NodeId(4294967040),
            span: ./src/main.rs:1:1: 3:2 (#0),
            vis: Visibility {
                kind: Inherited,
                span: no-location (#0),
                tokens: None,
            },
            ident: main#0,
            kind: Fn(
                Fn {
                    defaultness: Final,
                    generics: Generics {
                        params: [],
                        where_clause: WhereClause {
                            has_where_token: false,
                            predicates: [],
                            span: ./src/main.rs:1:10: 1:10 (#0),
                        },
                        span: ./src/main.rs:1:8: 1:8 (#0),
                    },
                    sig: FnSig {
                        header: FnHeader {
                            safety: Default,
                            coroutine_kind: None,
                            constness: No,
                            ext: None,
                        },
                        decl: FnDecl {
                            inputs: [],
                            output: Default(
                                ./src/main.rs:1:10: 1:10 (#0),
                            ),
                        },
                        span: ./src/main.rs:1:1: 1:10 (#0),
                    },
                    contract: None,
                    body: Some(
                        Block {
                            stmts: [
                                Stmt {
                                    id: NodeId(4294967040),
                                    kind: MacCall(
                                        MacCallStmt {
                                            mac: MacCall {
                                                path: Path {
                                                    span: ./src/main.rs:2:5: 2:12 (#0),
                                                    segments: [
                                                        PathSegment {
                                                            ident: println#0,
                                                            id: NodeId(4294967040),
                                                            args: None,
                                                        },
                                                    ],
                                                    tokens: None,
                                                },
                                                args: DelimArgs {
                                                    dspan: DelimSpan {
                                                        open: ./src/main.rs:2:13: 2:14 (#0),
                                                        close: ./src/main.rs:2:29: 2:30 (#0),
                                                    },
                                                    delim: Parenthesis,
                                                    tokens: TokenStream(
                                                        [
                                                            Token(
                                                                Token {
                                                                    kind: Literal(
                                                                        Lit {
                                                                            kind: Str,
                                                                            symbol: "Hello, world!",
                                                                            suffix: None,
                                                                        },
                                                                    ),
                                                                    span: ./src/main.rs:2:14: 2:29 (#0),
                                                                },
                                                                JointHidden,
                                                            ),
                                                        ],
                                                    ),
                                                },
                                            },
                                            style: Semicolon,
                                            attrs: [],
                                            tokens: None,
                                        },
                                    ),
                                    span: ./src/main.rs:2:5: 2:31 (#0),
                                },
                            ],
                            id: NodeId(4294967040),
                            rules: Default,
                            span: ./src/main.rs:1:11: 3:2 (#0),
                            tokens: None,
                            could_be_bare_literal: false,
                        },
                    ),
                },
            ),
            tokens: None,
        },
    ],
    spans: ModSpans {
        inner_span: ./src/main.rs:1:1: 3:2 (#0),
        inject_use_span: no-location (#0),
    },
    id: NodeId(4294967040),
    is_placeholder: false,
}

示例2

rust 复制代码
fn main() {  
    println!("test1");  
    println!("test2");  
}
rust 复制代码
Crate {
    attrs: [],
    items: [
        Item {
            attrs: [],
            id: NodeId(4294967040),
            span: ./src/main.rs:1:1: 4:2 (#0),
            vis: Visibility {
                kind: Inherited,
                span: no-location (#0),
                tokens: None,
            },
            ident: main#0,
            kind: Fn(
                Fn {
                    defaultness: Final,
                    generics: Generics {
                        params: [],
                        where_clause: WhereClause {
                            has_where_token: false,
                            predicates: [],
                            span: ./src/main.rs:1:10: 1:10 (#0),
                        },
                        span: ./src/main.rs:1:8: 1:8 (#0),
                    },
                    sig: FnSig {
                        header: FnHeader {
                            safety: Default,
                            coroutine_kind: None,
                            constness: No,
                            ext: None,
                        },
                        decl: FnDecl {
                            inputs: [],
                            output: Default(
                                ./src/main.rs:1:10: 1:10 (#0),
                            ),
                        },
                        span: ./src/main.rs:1:1: 1:10 (#0),
                    },
                    contract: None,
                    body: Some(
                        Block {
                            stmts: [
                                Stmt {
                                    id: NodeId(4294967040),
                                    kind: MacCall(
                                        MacCallStmt {
                                            mac: MacCall {
                                                path: Path {
                                                    span: ./src/main.rs:2:5: 2:12 (#0),
                                                    segments: [
                                                        PathSegment {
                                                            ident: println#0,
                                                            id: NodeId(4294967040),
                                                            args: None,
                                                        },
                                                    ],
                                                    tokens: None,
                                                },
                                                args: DelimArgs {
                                                    dspan: DelimSpan {
                                                        open: ./src/main.rs:2:13: 2:14 (#0),
                                                        close: ./src/main.rs:2:21: 2:22 (#0),
                                                    },
                                                    delim: Parenthesis,
                                                    tokens: TokenStream(
                                                        [
                                                            Token(
                                                                Token {
                                                                    kind: Literal(
                                                                        Lit {
                                                                            kind: Str,
                                                                            symbol: "test1",
                                                                            suffix: None,
                                                                        },
                                                                    ),
                                                                    span: ./src/main.rs:2:14: 2:21 (#0),
                                                                },
                                                                JointHidden,
                                                            ),
                                                        ],
                                                    ),
                                                },
                                            },
                                            style: Semicolon,
                                            attrs: [],
                                            tokens: None,
                                        },
                                    ),
                                    span: ./src/main.rs:2:5: 2:23 (#0),
                                },
                                Stmt {
                                    id: NodeId(4294967040),
                                    kind: MacCall(
                                        MacCallStmt {
                                            mac: MacCall {
                                                path: Path {
                                                    span: ./src/main.rs:3:5: 3:12 (#0),
                                                    segments: [
                                                        PathSegment {
                                                            ident: println#0,
                                                            id: NodeId(4294967040),
                                                            args: None,
                                                        },
                                                    ],
                                                    tokens: None,
                                                },
                                                args: DelimArgs {
                                                    dspan: DelimSpan {
                                                        open: ./src/main.rs:3:13: 3:14 (#0),
                                                        close: ./src/main.rs:3:21: 3:22 (#0),
                                                    },
                                                    delim: Parenthesis,
                                                    tokens: TokenStream(
                                                        [
                                                            Token(
                                                                Token {
                                                                    kind: Literal(
                                                                        Lit {
                                                                            kind: Str,
                                                                            symbol: "test2",
                                                                            suffix: None,
                                                                        },
                                                                    ),
                                                                    span: ./src/main.rs:3:14: 3:21 (#0),
                                                                },
                                                                JointHidden,
                                                            ),
                                                        ],
                                                    ),
                                                },
                                            },
                                            style: Semicolon,
                                            attrs: [],
                                            tokens: None,
                                        },
                                    ),
                                    span: ./src/main.rs:3:5: 3:23 (#0),
                                },
                            ],
                            id: NodeId(4294967040),
                            rules: Default,
                            span: ./src/main.rs:1:11: 4:2 (#0),
                            tokens: None,
                            could_be_bare_literal: false,
                        },
                    ),
                },
            ),
            tokens: None,
        },
    ],
    spans: ModSpans {
        inner_span: ./src/main.rs:1:1: 4:2 (#0),
        inject_use_span: no-location (#0),
    },
    id: NodeId(4294967040),
    is_placeholder: false,
}
相关推荐
Neolnfra1 分钟前
任意文件下载漏洞
计算机网络·安全·web安全·网络安全·系统安全·安全威胁分析·安全架构
云上漫步者4 小时前
深度实战:Rust交叉编译适配OpenHarmony PC——unicode_width完整适配案例
开发语言·后端·rust·harmonyos
想你依然心痛5 小时前
AI赋能编程语言挑战赛:从Python到Rust,我用AI大模型重塑开发效率
人工智能·python·rust
Neolnfra6 小时前
RCE(远程命令执行)漏洞全解析:从原理到实战
安全·web安全·http·网络安全·https·系统安全·可信计算技术
hhcgchpspk6 小时前
一次msf免杀渗透入门实践
linux·经验分享·网络安全·系统安全·渗透·msf
汤愈韬6 小时前
防火墙用户管理技术
网络协议·网络安全·huawei
云上漫步者7 小时前
深度实战:Rust交叉编译适配OpenHarmony PC——sys_locale完整适配案例
开发语言·后端·rust
勇敢牛牛_7 小时前
RustRover 2025.3 在WSL中GIT操作十分缓慢的问题
git·rust·rustrover
Neolnfra8 小时前
文件包含漏洞终极指南
开发语言·安全·web安全·网络安全·系统安全·php·可信计算技术
JPX-NO8 小时前
windows下编程IDE使用docker搭建的rust开发环境(Linux)
ide·windows·docker·rust