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

yyless triggers signed comparison warning when generated scanner is compiled with -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 编译器标志来转换警告 错误,因此 signed/unsigned 比较警告被标记并且 我在编译时遇到错误。

有谁知道 lex 是否有办法覆盖宏或更改 类型(yyleng 到 int)?

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

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

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 设为带符号的类型是不正确的,但它可能会消除警告,而且应该不会有什么坏处。)