如果DEB包中包含根据flex生成的源代码构建的共享库,/usr/bin/lintian将报告
因为flex-generated函数中的exit()调用yy_fatal_error:
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})
有关软件版本的信息:
大约一周前,我在debian-mentors邮件列表中发布了similar question
在flex-help邮件列表中,在flex生成的源代码中调用exit()的问题已经brought up,但该帖子没有回答。
答案 0 :(得分:-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函数会使用不同的返回值将此信息传递给调用者。