glsl_analyzer icon indicating copy to clipboard operation
glsl_analyzer copied to clipboard

Parser crash in incomplete initializer lists

Open automaticp opened this issue 5 months ago • 0 comments

Hi, hope you're doing well!

Stumbled upon this during refactoring of some code, here's a repro:

#version 450 core

struct S {
    float value;
};

void main() {
    const S s = {
    const float dummy = 0.0;
}

Version v1.5.1. Below is the output from a dry --parse-file run, maybe that gives you a hint without having to test this yourself.

glsl_analyzer --parse-file src/shaders/test.glsl 
thread 9939 panic: parser ran out of fuel (infinite loop?): parse.Tag.keyword_const
/home/automatic/projects/glsl_analyzer/src/parse.zig:0:17: 0x109f54e in infixExpressionOptImpl (glsl_analyzer)
/home/automatic/projects/glsl_analyzer/src/parse.zig:1053:34: 0x1086acb in constantExpressionOpt (glsl_analyzer)
    return infixExpressionOptImpl(p, .eof);
                                 ^
/home/automatic/projects/glsl_analyzer/src/parse.zig:989:31: 0x1094cf9 in assignmentExpressionOpt (glsl_analyzer)
    if (!constantExpressionOpt(p)) return false;
                              ^
/home/automatic/projects/glsl_analyzer/src/parse.zig:984:33: 0x107d2e4 in initializer (glsl_analyzer)
    if (!assignmentExpressionOpt(p)) p.emitError("expected an expression");
                                ^
/home/automatic/projects/glsl_analyzer/src/parse.zig:720:24: 0x107d270 in initializer (glsl_analyzer)
            initializer(p);
                       ^
/home/automatic/projects/glsl_analyzer/src/parse.zig:943:34: 0x106099e in variableDeclarationSuffix (glsl_analyzer)
    if (p.eat(.@"=")) initializer(p);
                                 ^
/home/automatic/projects/glsl_analyzer/src/parse.zig:938:30: 0x1087391 in simpleStatement (glsl_analyzer)
    variableDeclarationSuffix(p, m_var);
                             ^
/home/automatic/projects/glsl_analyzer/src/parse.zig:879:41: 0x107cb51 in statement (glsl_analyzer)
            const kind = simpleStatement(p);
                                        ^
/home/automatic/projects/glsl_analyzer/src/parse.zig:752:22: 0x106078c in block (glsl_analyzer)
            statement(p);
                     ^
/home/automatic/projects/glsl_analyzer/src/parse.zig:697:26: 0x102c395 in parse (glsl_analyzer)
                    block(p);
                         ^
/home/automatic/projects/glsl_analyzer/src/main.zig:64:35: 0x1050bf5 in main (glsl_analyzer)
        var tree = try parse.parse(allocator, source, .{ .diagnostics = &diagnostics });
                                  ^
/opt/zig/zig-linux-x86_64-0.13.0/lib/std/start.zig:524:37: 0x1057ae5 in main (glsl_analyzer)
            const result = root.main() catch |err| {
                                    ^
../sysdeps/nptl/libc_start_call_main.h:58:16: 0x7f2a21423a8f in __libc_start_call_main (../sysdeps/x86/libc-start.c)
../csu/libc-start.c:360:3: 0x7f2a21423b48 in __libc_start_main_impl (../sysdeps/x86/libc-start.c)
???:?:?: 0x102a194 in ??? (???)
???:?:?: 0x0 in ??? (???)
Aborted (core dumped)

automaticp avatar Sep 16 '24 10:09 automaticp