Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

translate-c panic on ffmpeg headers #8129

Closed
jedisct1 opened this issue Mar 2, 2021 · 5 comments · Fixed by #8134
Closed

translate-c panic on ffmpeg headers #8129

jedisct1 opened this issue Mar 2, 2021 · 5 comments · Fixed by #8134
Labels
bug Observed behavior contradicts documented or intended behavior contributor friendly This issue is limited in scope and/or knowledge of Zig internals. translate-c C to Zig source translation feature (@cImport)
Milestone

Comments

@jedisct1
Copy link
Contributor

jedisct1 commented Mar 2, 2021

translate-c panics in a funny way on FFmpeg headers:

zig translate-c -I/usr/local/opt/ffmpeg/include /usr/local/opt/ffmpeg/include/libavformat/avformat.h
thread 4621208 panic: reached unreachable code
/Users/j/src/zig/lib/std/builtin.zig:688:54: 0x10ad0ff88 in std.builtin.default_panic (zig1)
            std.debug.panicExtra(error_return_trace, first_trace_addr, "{s}", .{msg});
                                                     ^
/Users/j/src/zig/lib/std/mem/Allocator.zig:290:40: 0x10ae9551d in std.mem.Allocator.allocAdvancedWithRetAddr (zig1)
    const byte_slice = try self.allocFn(self, byte_count, a, len_align, return_address);
                                       ^
/Users/j/src/zig/lib/std/fmt.zig:88:9: 0x10b29a386 in std.fmt.format (zig1)
) !void {
        ^
/Users/j/src/zig/src/translate_c.zig:2510:32: 0x10b1a716c in translate_c.transCharLiteral (zig1)
            // @as(T, x)
                               ^
/Users/j/src/zig/lib/std/fmt.zig:248:20: 0x10b2a0495 in std.fmt.format (zig1)
        options = .{};
                   ^
/Users/j/src/zig/lib/std/zig/fmt.zig:48:17: 0x10b2a1481 in std.zig.fmt.formatEscapes (zig1)
        '\\' => try writer.writeAll("\\\\"),
                ^
/Users/j/src/zig/lib/std/fmt.zig:248:20: 0x10b4458b1 in std.fmt.format (zig1)
        options = .{};
                   ^
/Users/j/src/zig/lib/std/fmt.zig:219:32: 0x10b29cec7 in std.fmt.format (zig1)
            try writer.writeAll(fmt[start_index..end_index]);
                               ^
/Users/j/src/zig/lib/std/zig/render.zig:245:17: 0x10b2a3f07 in std.zig.render.renderExpression (zig1)
                try renderToken(ais, tree, payload_token - 1, .none); // |
                ^
/Users/j/src/zig/lib/std/fmt.zig:719:9: 0x10b1a8332 in std.fmt.formatText (zig1)
            options: std.fmt.FormatOptions,
        ^
/Users/j/src/zig/lib/std/fmt.zig:1474:46: 0x10b07a2dd in std.fmt.allocPrint (zig1)
    std.testing.expect((try parseUnsigned(u32, "DeadBeef", 16)) == 0xDEADBEEF);
                                             ^
/Users/j/src/zig/src/translate_c/ast.zig:2517:25: 0x10af50e00 in translate_c.ast.renderParams (zig1)

                        ^
/Users/j/src/zig/lib/std/mem/Allocator.zig:439:25: 0x10adee693 in std.mem.Allocator.alignedShrinkWithRetAddr (zig1)
    _ = self.shrinkBytes(old_byte_slice, Slice.alignment, byte_count, 0, return_address);
                        ^
/Users/j/src/zig/src/Cache.zig:539:0: 0x10ad9d903 in Cache.Manifest.final (zig1)
                    std.log.err("failed parsing {s}: {s}", .{ dep_file_basename, error_buf.items });

/Users/j/src/zig/src/main.zig:2187:35: 0x10ae0c9b0 in main.cmdTranslateC (zig1)
            try man.addDepFilePost(zig_cache_tmp_dir, dep_basename);
                                  ^
/Users/j/src/zig/src/main.zig:1725:11: 0x10ad3e22b in main.buildOutputType (zig1)
    defer if (root_pkg) |p| p.destroy(gpa);
          ^
/Users/j/src/zig/src/main.zig:178:37: 0x10ad14ada in main.mainArgs (zig1)
        return buildOutputType(gpa, arena, args, .run);
                                    ^
/Users/j/src/zig/lib/std/debug.zig:287:58: 0x10ad13f1f in std.debug.panicExtra (zig1)
                    stderr.print("thread {d} panic: ", .{current_thread_id}) catch os.abort();
                                                         ^
???:?:?: 0x7fff20406f3c in ??? (???)
???:?:?: 0x3 in ??? (???)

This is with FFmpeg 4.3.2, standard install on macOS with Homebrew.

@andrewrk
Copy link
Member

andrewrk commented Mar 2, 2021

I have no doubt that you found a bug, but could you double check that you have rebuilt zig after pulling the latest standard library changes? This stack trace looks like what happens when the source and binary mismatch. I think if you rebuild and re-run the test case, it will produce a more helpful stack trace.

@andrewrk andrewrk added bug Observed behavior contradicts documented or intended behavior translate-c C to Zig source translation feature (@cImport) labels Mar 2, 2021
@andrewrk andrewrk added this to the 0.9.0 milestone Mar 2, 2021
@jedisct1
Copy link
Contributor Author

jedisct1 commented Mar 3, 2021

New stack trace, Zig just recompiled from 3ad9cb8

thread 4841080 panic: reached unreachable code
/Users/j/src/zig/lib/std/builtin.zig:688:54: 0x10e13f808 in std.builtin.default_panic (zig1)
            std.debug.panicExtra(error_return_trace, first_trace_addr, "{s}", .{msg});
                                                     ^
/Users/j/src/zig/lib/std/mem/Allocator.zig:290:40: 0x10e2c4e1d in std.mem.Allocator.allocAdvancedWithRetAddr (zig1)
    const byte_slice = try self.allocFn(self, byte_count, a, len_align, return_address);
                                       ^
/Users/j/src/zig/lib/std/fmt.zig:0:13: 0x10e6ca736 in std.fmt.format (zig1)
/Users/j/src/zig/src/translate_c.zig:1918:39: 0x10e5d6eec in translate_c.literalFitsInType (zig1)
    const is_signed = cIsSignedInteger(qt);
                                      ^
/Users/j/src/zig/lib/std/fmt.zig:358:9: 0x10e6d0845 in std.fmt.format (zig1)
        try formatType(
        ^
/Users/j/src/zig/lib/std/zig/fmt.zig:45:17: 0x10e6d1831 in std.zig.fmt.formatEscapes (zig1)
        '\n' => try writer.writeAll("\\n"),
                ^
/Users/j/src/zig/lib/std/fmt.zig:219:13: 0x10e878801 in std.fmt.format (zig1)
            try writer.writeAll(fmt[start_index..end_index]);
            ^
/Users/j/src/zig/src/translate_c.zig:3505:44: 0x10e6cd277 in translate_c.cIsSignedInteger (zig1)
    if (c_type.getTypeClass() != .Builtin) return false;
                                           ^
/Users/j/src/zig/lib/std/zig/render.zig:245:17: 0x10e6d42b7 in std.zig.render.renderExpression (zig1)
                try renderToken(ais, tree, payload_token - 1, .none); // |
                ^
/Users/j/src/zig/lib/std/mem/Allocator.zig:296:23: 0x10e5d80b2 in std.mem.Allocator.allocAdvancedWithRetAddr (zig1)
    @memset(byte_slice.ptr, undefined, byte_slice.len);
                      ^
/Users/j/src/zig/lib/std/fmt.zig:0:17: 0x10e4a943d in std.fmt.allocPrint (zig1)
/Users/j/src/zig/src/translate_c/ast.zig:2525:25: 0x10e380640 in translate_c.ast.renderParams (zig1)
        if (i != 0) _ = try c.addToken(.comma, ",");
                        ^
/Users/j/src/zig/lib/std/mem/Allocator.zig:439:25: 0x10e21e3c3 in std.mem.Allocator.alignedShrinkWithRetAddr (zig1)
    _ = self.shrinkBytes(old_byte_slice, Slice.alignment, byte_count, 0, return_address);
                        ^
/Users/j/src/zig/src/Cache.zig:547:0: 0x10e1cd1f3 in Cache.Manifest.final (zig1)
    pub fn final(self: *Manifest) [hex_digest_len]u8 {

/Users/j/src/zig/src/main.zig:2187:35: 0x10e23c6e0 in main.cmdTranslateC (zig1)
            try man.addDepFilePost(zig_cache_tmp_dir, dep_basename);
                                  ^
/Users/j/src/zig/src/main.zig:1725:11: 0x10e16daab in main.buildOutputType (zig1)
    defer if (root_pkg) |p| p.destroy(gpa);
          ^
/Users/j/src/zig/src/main.zig:178:37: 0x10e14435a in main.mainArgs (zig1)
        return buildOutputType(gpa, arena, args, .run);
                                    ^
/Users/j/src/zig/lib/std/debug.zig:287:58: 0x10e14379f in std.debug.panicExtra (zig1)
                    stderr.print("thread {d} panic: ", .{current_thread_id}) catch os.abort();
                                                         ^
???:?:?: 0x7fff20406f3c in ??? (???)
???:?:?: 0x4 in ??? (???)

@andrewrk andrewrk changed the title translate-c: translate-c panic on ffmpeg headers Mar 3, 2021
@andrewrk
Copy link
Member

andrewrk commented Mar 3, 2021

Not sure what's going on with your zig installation - when I run it I get a stack trace that points to unreachable, as expected:

[nix-shell:~/Downloads/zig/build]$ ./zig translate-c ~/local/ffmpeg/include/libavformat/avformat.h -I ~/local/ffmpeg/include/ -lc
thread 19650 panic: reached unreachable code
/home/andy/Downloads/zig/lib/std/debug.zig:223:14: 0xad3fa8 in std.debug.assert (zig1)
    if (!ok) unreachable; // assertion failure
             ^
/home/andy/Downloads/zig/lib/std/zig/ast.zig:114:15: 0xc52a8b in std.zig.ast.Tree.tokenSlice (zig1)
        assert(token.tag == token_tag);
              ^
/home/andy/Downloads/zig/lib/std/zig/render.zig:2449:30: 0x10445c5 in std.zig.render.tokenSliceForRender (zig1)
    var ret = tree.tokenSlice(token_index);
                             ^
/home/andy/Downloads/zig/lib/std/zig/render.zig:2273:39: 0xf51dae in std.zig.render.renderToken (zig1)
    const lexeme = tokenSliceForRender(tree, token_index);
                                      ^
/home/andy/Downloads/zig/lib/std/zig/render.zig:192:30: 0x104a62e in std.zig.render.renderExpression (zig1)
        => return renderToken(ais, tree, main_tokens[node], space),
                             ^
/home/andy/Downloads/zig/lib/std/zig/render.zig:378:33: 0x104b61a in std.zig.render.renderExpression (zig1)
            try renderExpression(gpa, ais, tree, infix.lhs, .space);
                                ^
/home/andy/Downloads/zig/lib/std/zig/render.zig:2152:29: 0x1214355 in std.zig.render.renderCall (zig1)
        try renderExpression(gpa, ais, tree, param_node, .none);
                            ^
/home/andy/Downloads/zig/lib/std/zig/render.zig:457:29: 0x10470b7 in std.zig.render.renderExpression (zig1)
        => return renderCall(gpa, ais, tree, tree.callFull(node), space),
                            ^
/home/andy/Downloads/zig/lib/std/zig/render.zig:985:25: 0x104db47 in std.zig.render.renderVarDecl (zig1)
    try renderExpression(gpa, ais, tree, var_decl.ast.init_node, .semicolon);
                        ^
/home/andy/Downloads/zig/lib/std/zig/render.zig:143:49: 0xf52f24 in std.zig.render.renderMember (zig1)
        .simple_var_decl => return renderVarDecl(gpa, ais, tree, tree.simpleVarDecl(decl)),
                                                ^
/home/andy/Downloads/zig/lib/std/zig/render.zig:50:25: 0xe272cd in std.zig.render.renderMembers (zig1)
        try renderMember(gpa, ais, tree, member, .newline);
                        ^
/home/andy/Downloads/zig/lib/std/zig/render.zig:37:22: 0xd0e70d in std.zig.render.renderTree (zig1)
    try renderMembers(buffer.allocator, ais, tree, tree.rootDecls());
                     ^
/home/andy/Downloads/zig/lib/std/zig/ast.zig:67:50: 0xbaccb3 in std.zig.ast.Tree.renderToArrayList (zig1)
        return @import("./render.zig").renderTree(buffer, tree);
                                                 ^
/home/andy/Downloads/zig/lib/std/zig/ast.zig:62:35: 0xb5e502 in std.zig.ast.Tree.render (zig1)
        try tree.renderToArrayList(&buffer);
                                  ^
/home/andy/Downloads/zig/src/main.zig:2203:42: 0xbca64f in main.cmdTranslateC (zig1)
        const formatted = try tree.render(comp.gpa);
                                         ^
/home/andy/Downloads/zig/src/main.zig:1906:29: 0xb01d49 in main.buildOutputType (zig1)
        return cmdTranslateC(comp, arena, have_enable_cache);
                            ^
/home/andy/Downloads/zig/src/main.zig:184:31: 0xad8fef in main.mainArgs (zig1)
        return buildOutputType(gpa, arena, args, .translate_c);
                              ^
/home/andy/Downloads/zig/src/stage1.zig:45:24: 0xad843e in main (zig1)
        stage2.mainArgs(gpa, arena, args) catch unreachable;
                       ^
Aborted (core dumped)

This appears to be a recent regression caused by #7920.

@andrewrk andrewrk modified the milestones: 0.9.0, 0.8.0 Mar 3, 2021
@andrewrk andrewrk added the contributor friendly This issue is limited in scope and/or knowledge of Zig internals. label Mar 3, 2021
@LemonBoy
Copy link
Contributor

LemonBoy commented Mar 3, 2021

Reduced:

#define BAR FOO(0BGR, Q)

@Vexu
Copy link
Member

Vexu commented Mar 3, 2021

Can't reproduce with zig translate-c /usr/include/libavformat/avformat.h -lc -lavcodec on version 0.8.0-dev.1396+5bd9a6451. nvm zig was built with RelWithDebInfo.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
bug Observed behavior contradicts documented or intended behavior contributor friendly This issue is limited in scope and/or knowledge of Zig internals. translate-c C to Zig source translation feature (@cImport)
Projects
None yet
Development

Successfully merging a pull request may close this issue.

4 participants