Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1757465AbbGUB2q (ORCPT ); Mon, 20 Jul 2015 21:28:46 -0400 Received: from mail-wi0-f181.google.com ([209.85.212.181]:34914 "EHLO mail-wi0-f181.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1755995AbbGUB2p (ORCPT ); Mon, 20 Jul 2015 21:28:45 -0400 MIME-Version: 1.0 In-Reply-To: <1437436369-46257-1-git-send-email-ryao@gentoo.org> References: <1437436369-46257-1-git-send-email-ryao@gentoo.org> Date: Mon, 20 Jul 2015 21:28:44 -0400 Message-ID: Subject: Re: [PATCH] genksyms: Duplicate function pointer type definitions segfault From: Richard Yao To: Richard Yao Cc: linux-kernel@vger.kernel.org, Madhuri Yechuri Content-Type: text/plain; charset=UTF-8 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 2912 Lines: 73 On 20 July 2015 at 19:52, Richard Yao wrote: > > From: Richard Yao > > 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: > > int (*f)(); > int (*f)(); There is a typo in the commit message. This should have been: 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: Richard Yao > Acked-by: Madhuri Yechuri > --- > scripts/genksyms/parse.y | 9 +++++++++ > 1 file changed, 9 insertions(+) > > diff --git a/scripts/genksyms/parse.y b/scripts/genksyms/parse.y > index b9f4cf2..723ab30 100644 > --- a/scripts/genksyms/parse.y > +++ b/scripts/genksyms/parse.y > @@ -303,6 +303,15 @@ direct_declarator: > $$ = $1; > } > } > + | TYPE > + { if (current_name != NULL) { > + error_with_pos("unexpected second declaration name"); > + YYERROR; > + } else { > + current_name = (*$1)->string; > + $$ = $1; > + } > + } > | direct_declarator '(' parameter_declaration_clause ')' > { $$ = $4; } > | direct_declarator '(' error ')' > -- > 2.3.6 > -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/