Skip to content

aro_translate_c: undefined triggers illegal behavior later in ast rendering #22601

Closed
@jacobly0

Description

@jacobly0
diff --git a/lib/compiler/aro_translate_c/ast.zig b/lib/compiler/aro_translate_c/ast.zig
index b92db7862f..4c74f272d7 100644
--- a/lib/compiler/aro_translate_c/ast.zig
+++ b/lib/compiler/aro_translate_c/ast.zig
@@ -776,8 +776,8 @@ pub fn render(gpa: Allocator, nodes: []const Node) !std.zig.Ast {
         .tag = .root,
         .main_token = 0,
         .data = .{
-            .lhs = undefined,
-            .rhs = undefined,
+            .lhs = std.math.maxInt(u32),
+            .rhs = std.math.maxInt(u32),
         },
     });
 
@@ -993,7 +993,7 @@ fn renderNode(c: *Context, node: Node) Allocator.Error!NodeIndex {
             .main_token = try c.addToken(.keyword_continue, "continue"),
             .data = .{
                 .lhs = 0,
-                .rhs = undefined,
+                .rhs = std.math.maxInt(u32),
             },
         }),
         .return_void => return c.addNode(.{
@@ -1001,7 +1001,7 @@ fn renderNode(c: *Context, node: Node) Allocator.Error!NodeIndex {
             .main_token = try c.addToken(.keyword_return, "return"),
             .data = .{
                 .lhs = 0,
-                .rhs = undefined,
+                .rhs = std.math.maxInt(u32),
             },
         }),
         .@"break" => return c.addNode(.{
@@ -1035,7 +1035,7 @@ fn renderNode(c: *Context, node: Node) Allocator.Error!NodeIndex {
                 .main_token = try c.addToken(.keyword_return, "return"),
                 .data = .{
                     .lhs = try renderNode(c, payload),
-                    .rhs = undefined,
+                    .rhs = std.math.maxInt(u32),
                 },
             });
         },
@@ -1046,7 +1046,7 @@ fn renderNode(c: *Context, node: Node) Allocator.Error!NodeIndex {
                 .main_token = try c.addToken(.keyword_comptime, "comptime"),
                 .data = .{
                     .lhs = try renderNode(c, payload),
-                    .rhs = undefined,
+                    .rhs = std.math.maxInt(u32),
                 },
             });
         },
@@ -1056,7 +1056,7 @@ fn renderNode(c: *Context, node: Node) Allocator.Error!NodeIndex {
                 .tag = .@"defer",
                 .main_token = try c.addToken(.keyword_defer, "defer"),
                 .data = .{
-                    .lhs = undefined,
+                    .lhs = std.math.maxInt(u32),
                     .rhs = try renderNode(c, payload),
                 },
             });
@@ -1106,7 +1106,7 @@ fn renderNode(c: *Context, node: Node) Allocator.Error!NodeIndex {
                 .main_token = tok,
                 .data = .{
                     .lhs = arg,
-                    .rhs = undefined,
+                    .rhs = std.math.maxInt(u32),
                 },
             });
         },
@@ -1326,7 +1326,7 @@ fn renderNode(c: *Context, node: Node) Allocator.Error!NodeIndex {
                 .tag = .deref,
                 .data = .{
                     .lhs = try renderNodeGrouped(c, payload.init),
-                    .rhs = undefined,
+                    .rhs = std.math.maxInt(u32),
                 },
                 .main_token = try c.addToken(.period_asterisk, ".*"),
             });
@@ -1507,7 +1507,7 @@ fn renderNode(c: *Context, node: Node) Allocator.Error!NodeIndex {
                 .main_token = ampersand,
                 .data = .{
                     .lhs = base,
-                    .rhs = undefined,
+                    .rhs = std.math.maxInt(u32),
                 },
             });
         },
@@ -1520,7 +1520,7 @@ fn renderNode(c: *Context, node: Node) Allocator.Error!NodeIndex {
                 .main_token = deref_tok,
                 .data = .{
                     .lhs = operand,
-                    .rhs = undefined,
+                    .rhs = std.math.maxInt(u32),
                 },
             });
         },
@@ -1796,7 +1796,7 @@ fn renderNode(c: *Context, node: Node) Allocator.Error!NodeIndex {
                 .main_token = try c.addToken(.bang, "!"),
                 .data = .{
                     .lhs = try renderNodeGrouped(c, payload),
-                    .rhs = undefined,
+                    .rhs = std.math.maxInt(u32),
                 },
             });
             _ = try c.addToken(.r_paren, ")");
@@ -2541,7 +2541,7 @@ fn renderPrefixOp(c: *Context, node: Node, tag: std.zig.Ast.Node.Tag, tok_tag: T
         .main_token = try c.addToken(tok_tag, bytes),
         .data = .{
             .lhs = try renderNodeGrouped(c, payload),
-            .rhs = undefined,
+            .rhs = std.math.maxInt(u32),
         },
     });
 }
$ cat repro.h
void foo(void) {
    for (;;) {
        continue;
    }
}
$ zig translate-c -lc repro.h
thread 230209 panic: index out of bounds: index 4294967295, len 2050
Unwind error at address `:0x22e8e03` (error.AddressOutOfRange), trace may be incomplete

lib/std/zig/render.zig:350:22: 0x229d60b in renderExpression (std.zig)
    switch (node_tags[node]) {
                     ^
lib/std/zig/render.zig:705:37: 0x22a356b in renderExpression (std.zig)
                try renderExpression(r, target, space);
                                    ^
lib/std/zig/render.zig:1969:41: 0x2d1afc6 in finishRenderBlock (std.zig)
            else => try renderExpression(r, stmt, .semicolon),
                                        ^
lib/std/zig/render.zig:1947:29: 0x27cfc95 in renderBlock (std.zig)
    return finishRenderBlock(r, block_node, statements, space);
                            ^
lib/std/zig/render.zig:402:31: 0x22a2161 in renderExpression (std.zig)
            return renderBlock(r, node, statements, space);
                              ^
lib/std/zig/render.zig:1390:33: 0x2d1efb1 in renderThenElse (std.zig)
            try renderExpression(r, then_expr, space);
                                ^
lib/std/zig/render.zig:1322:23: 0x27e6c07 in renderWhile (std.zig)
    try renderThenElse(
                      ^
lib/std/zig/render.zig:871:30: 0x22a4b84 in renderExpression (std.zig)
        => return renderWhile(r, tree.fullWhile(node).?, space),
                             ^
lib/std/zig/render.zig:1969:41: 0x2d1afc6 in finishRenderBlock (std.zig)
            else => try renderExpression(r, stmt, .semicolon),
                                        ^
lib/std/zig/render.zig:1947:29: 0x27cfc95 in renderBlock (std.zig)
    return finishRenderBlock(r, block_node, statements, space);
                            ^
lib/std/zig/render.zig:402:31: 0x22a2161 in renderExpression (std.zig)
            return renderBlock(r, node, statements, space);
                              ^
lib/std/zig/render.zig:249:40: 0x27ed534 in renderMember (std.zig)
                return renderExpression(r, body_node, space);
                                       ^
lib/std/zig/render.zig:128:25: 0x22a7c86 in renderMembers (std.zig)
        try renderMember(r, container, member, .newline);
                        ^
lib/std/zig/render.zig:110:26: 0x1ed50ce in renderTree (std.zig)
        try renderMembers(&r, tree.rootDecls());
                         ^
lib/std/zig/Ast.zig:127:46: 0x1c26e8f in renderToArrayList (std.zig)
    return @import("./render.zig").renderTree(buffer, tree, fixups);
                                             ^
lib/std/zig/Ast.zig:120:31: 0x1beed37 in render (std.zig)
    try tree.renderToArrayList(&buffer, .{});
                              ^
src/main.zig:4604:55: 0x1a89a63 in cmdTranslateC (main.zig)
                break :f .{ .success = try tree.render(arena) };
                                                      ^
src/main.zig:3669:33: 0x1aaf607 in buildOutputType (main.zig)
            return cmdTranslateC(comp, arena, null, null, root_prog_node);
                                ^
src/main.zig:315:31: 0x1af3274 in mainArgs (main.zig)
        return buildOutputType(gpa, arena, args, .translate_c);
                              ^
src/main.zig:214:20: 0x19b9bf4 in main (main.zig)
    return mainArgs(gpa, arena, args);
                   ^
lib/std/start.zig:656:37: 0x19b7f89 in main (std.zig)
            const result = root.main() catch |err| {
                                    ^
Aborted (core dumped)

See #20095 for why safety is broken with the llvm backend.

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugObserved behavior contradicts documented or intended behaviortranslate-cC to Zig source translation feature (@cImport)

    Type

    No type

    Projects

    No projects

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions