• Richard Yao's avatar
    genksyms: Duplicate function pointer type definitions segfault · 1c722503
    Richard Yao authored
    I noticed that genksyms will segfault when it sees duplicate function
    pointer type declaration when I placed the same function pointer
    definition in two separate headers in a local branch as an intermediate
    step of some refactoring. This can be reproduced by piping the following
    minimal test case into `genksyms -r /dev/null` or alternatively, putting
    it into a C file attempting a build:
    
    typedef int (*f)();
    typedef int (*f)();
    
    Attaching gdb to genksyms to understand this failure is useless without
    changing CFLAGS to emit debuginfo. Once you have debuginfo, you will
    find that the failure is that `char *s` was NULL and the program
    executed `while(*s)`. At which point, further debugging requires
    familiarity with compiler front end / parser development.
    
    What happens is that flex identifies the first instance of the token "f"
    as IDENT and the yacc parser adds it to the symbol table. On the second
    instance, flex will identify "f" as TYPE, which triggers an error case
    in the yacc parser. Given that TYPE would have been IDENT had it not
    been in the symbol table, the the segmentaion fault could be avoided by
    treating TYPE as IDENT in the affected rule.
    
    Some might consider placing identical function pointer type declarations
    in different headers to be poor style might consider a failure to be
    beneficial. However, failing through a segmentation fault makes the
    cause non-obvious and can waste the time of anyone who encounters it.
    Signed-off-by: default avatarRichard Yao <richard.yao@clusterhq.com>
    Acked-by: default avatarMadhuri Yechuri <madhuriyechuri@clusterhq.com>
    Signed-off-by: default avatarMichal Marek <mmarek@suse.com>
    1c722503
parse.y 11.1 KB