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,
}
相关推荐
萧曵 丶2 小时前
Rust 所有权系统:深入浅出指南
开发语言·后端·rust
GetcharZp4 小时前
彻底告别数据焦虑!这款开源神器 RustDesk,让你自建一个比向日葵、ToDesk 更安全的远程桌面
后端·rust
独行soc5 小时前
2025年渗透测试面试题总结-2025年HW(护网面试) 33(题目+回答)
linux·科技·安全·网络安全·面试·职场和发展·护网
solohoho5 小时前
Rust:结构体、方法生命周期标注核心要义
rust
Chen--Xing8 小时前
第一届OpenHarmonyCTF--Crypto--WriteUp
网络安全·密码学·harmonyos
合作小小程序员小小店11 小时前
web渗透之指纹识别1
物联网·计算机网络·网络安全·网络攻击模型
2501_9159184112 小时前
接口漏洞怎么抓?Fiddler 中文版 + Postman + Wireshark 实战指南
websocket·网络协议·tcp/ip·http·网络安全·https·udp
Humbunklung14 小时前
Rust枚举:让数据类型告别单调乏味
开发语言·后端·rust
网硕互联的小客服14 小时前
未来趋势:AI与量子计算对服务器安全的影响
运维·服务器·网络·网络安全·量子计算
柑木15 小时前
Rust-开发应用-如何实现单例
后端·rust