C语言 yyless 在使用 -Wsign-compare 编译生成的扫描程序时触发带符号的比较警告



我的一个 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 创建生成的文件后,无论如何都不会修改它。当然,我可以去向生成的文件添加强制转换,但如果有人更改词法分析器,这将在将来造成麻烦。

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设置为签名类型是不正确的,但它可能会压制警告,并且应该不会受到伤害。

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

最新更新