lintian报告说,在构建DEB包时,shlib从flex生成的源代码中调用exit



如果DEB包包含根据flex生成的源代码构建的共享库,/usr/bin/litian将报告

shlib调用退出

因为flex生成的函数yy_catal_error:中的exit()调用

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

如何修改DEB包,使lintian停止报告shlib调用退出?

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})

有关软件版本的信息:

  • flex 2.5.35
  • cmake 2.8.9
  • 临田2.5.10
  • Linux发行版:Debian不稳定(sid)

大约一周前,我在debian导师邮件列表上发布了一个类似的问题

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

将exit()调用替换为abort()调用lintian将不再报告shlib调用退出。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函数将使用不同的返回值将此信息传递给调用者。

最新更新