当生成的扫描程序使用-Wsign-compare编译时​​,yyless触发签名的比较警告

时间:2016-02-28 22:26:25

标签: c flex-lexer

我遇到了我的一个lex(flex 2.6.0)扫描程序规则,它看起来像是:

. {
  /* Place the char back and process statment normally. */
  yyless(0);
  yycolumn--;
  BEGIN(CONDITION_NORMAL);
}

麻烦来自宏yyless(0),它扩展为:

do {
 int yyl;
 for ( yyl = n; yyl < yyleng; ++yyl )
   if ( yytext[yyl] == '\n' )
     --yylineno;
}while(0)

问题是yyleng是一个无符号类型。在项目中 我正在努力,我们有gcc编译器标志来转换警告 错误,以便签名/未签名的比较警告得到标记和 我在编译时遇到错误。

有没有人知道lex是否有覆盖宏或更改的方法 类型(yyleng到int)?

编辑:(澄清) 我们需要有一个解决方案,在Lex创建它之后无论如何都不会修改生成的文件。当然,我可以在生成的文件中添加一个强制转换器,但如果有人更改了词法分析器,那么将来会造成麻烦。

2 个答案:

答案 0 :(得分:2)

flex维护者的官方政策是不支持-Werror。 (我引用:“......编译器的警告不是flex的错误。特别是,”gcc -Werror“可能会失败。”)

尽管如此,我对这个错误报告表示同情,并且我已经提交了这样的报告(https://sourceforge.net/p/flex/bugs/201/

最简单的解决方法是将该错误报告中的补丁应用到您的flex副本并重建它。如果您的软件分发方法是分发生成的文件,那么(加上关于该问题的说明)应该足够了,尽管我同意它并不理想。

如果您想要一个丑陋的解决方法,可以在编译生成的扫描程序文件时尝试将-DYY_TYPEDEF_YY_SIZE_T -Dyy_size_t=ssize_t添加到编译器标志中。我没试过;如果你这样做并且它不起作用,请告诉我。 (我认为将yy_size_t设为签名类型并不正确,但它可能会压制警告,并且不应该受到伤害。)

答案 1 :(得分:0)

将yyleng复制到局部变量,在本地范围内将yyleng重新定义为int,然后赋值。