0

如果一个DEB包包含一个由flex生成的源代码构建的共享库,/usr/bin/lintian会报告

shlib-调用-退出

由于 flex 生成的函数 yy_fatal_error 中的 exit() 调用:

static void yy_fatal_error (yyconst char* msg )
{
        (void) fprintf( stderr, "%s\n", msg );
        exit( YY_EXIT_FAILURE );
}

如何修改 DEB 包,让 lintian 停止报告 shlib-calls-exit?

DEB 包在其构建脚本中使用了CMake 。对应的 CMake 源代码片段是

flex_target(scanner lexer.l ${CMAKE_CURRENT_BINARY_DIR}/lexer.c)
bison_target(parser parser.y ${CMAKE_CURRENT_BINARY_DIR}/parser.c) 
add_flex_bison_dependency(scanner parser)
add_library(parse-and-scan SHARED ${FLEX_scanner_OUTPUTS} ${BISON_parser_OUTPUT_SOURCE})

软件版本信息:

  • 弹性 2.5.35
  • cmake 2.8.9
  • 临田 2.5.10
  • Linux 发行版:Debian Unstable (sid)

大约一周前,我在 debian-mentors 邮件列表中发布了一个类似的问题

在 flex 生成的源代码中调用 exit() 的问题已在 flex-help 邮件列表中提出,但该帖子没有给出任何答案。

4

1 回答 1

-1

通过用 abort() 调用替换 exit() 调用,lintian将不再报告 shlib-calls-exit。CMake 可以通过将文件lexer.c读入字符串,然后进行文本替换,然后将字符串写入新文件 lexer_replaced.c(任意文件名)来处理这种替换。

flex_target(scanner lexer.l ${CMAKE_CURRENT_BINARY_DIR}/lexer.c)
bison_target(parser parser.y ${CMAKE_CURRENT_BINARY_DIR}/parser.c) 
add_flex_bison_dependency(scanner parser)
set(replaced_file ${CMAKE_CURRENT_BINARY_DIR}/lexer_replaced.c)
file(WRITE ${CMAKE_CURRENT_BINARY_DIR}/replace_exit_with_abort.cmake "
  file(READ ${FLEX_scanner_OUTPUTS} var1)
  string(REPLACE \"exit\\( YY_EXIT_FAILURE \\);\" \"abort();\" var2 \"\${var1}\")
  file(WRITE ${replaced_file} \"\${var2}\")
")
add_custom_command(OUTPUT ${replaced_file}
  COMMAND ${CMAKE_COMMAND} 
  ARGS -P ${CMAKE_CURRENT_BINARY_DIR}/replace_exit_with_abort.cmake
  DEPENDS ${FLEX_scanner_OUTPUTS}
)
add_library(parse-and-scan SHARED ${replaced_file} ${BISON_parser_OUTPUT_SOURCE})

我认为这是一个可行的解决方案,但从长远来看,最好的解决方案是修改程序flex以始终从其函数返回,而不是有时使用 exit() 调用。如果发生错误情况,则 flex 函数将通过使用不同的返回值将此信息传递给调用者。

于 2012-11-13T16:00:39.190 回答