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,
}
相关推荐
JordanHaidee4 小时前
【Rust GUI开发入门】编写一个本地音乐播放器(8. 从文件中提取歌曲元信息)
rust
清心9157 小时前
Windows系统Rust安装与配置,解决安装慢问题
rust
清心9157 小时前
Windows系统Rust安装,自定义安装目录
rust
运维行者_10 小时前
OpManager 与 iOS 26:开启 IT 运维新时代
运维·网络·网络协议·网络安全·ios·iphone·告警
恒云客10 小时前
Rust开发环境配置
开发语言·后端·rust
歪歪10011 小时前
如何在项目中选择使用HTTP还是WebSocket?
网络·websocket·网络协议·计算机网络·http·网络安全
知攻善防实验室12 小时前
大洞,速修,Redis远程命令执行漏洞。
安全·网络安全·渗透测试
RrEeSsEeTt13 小时前
【HackTheBox】- Eureka 靶机学习
linux·网络安全·渗透测试·kali·hackthebox
猫耳君1 天前
汽车网络安全 CyberSecurity ISO/SAE 21434 测试之四
安全·web安全·网络安全·汽车·测试·security·cybersecurity
歪歪1001 天前
Http与WebSocket网络通信协议的对比
网络·websocket·网络协议·计算机网络·http·网络安全·信息与通信