0

flexによって生成されたソースコードから構築された共有ライブラリがDEBパッケージに含まれている場合、/usr/bin/lintianは次のように報告します。

shlib-calls-exit

フレックス生成関数 yy_fatal_error での exit() 呼び出しのため:

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

lintian が shlib-calls-exit の報告を停止するように DEB パッケージを変更するにはどうすればよいですか?

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
  • lintian 2.5.10
  • Linux ディストリビューション: Debian Unstable (sid)

約 1 週間前、同様の質問を debian-mentors メーリング リストに投稿しました。

flex で生成されたソース コードに exit() 呼び出しがあるという問題は、flex-help メーリング リストで取り上げられましたが、その投稿には回答がありませんでした。

4

1 に答える 1

-1

exit() 呼び出しを abort() 呼び出しに置き換えると、 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})

これは実行可能な解決策だと思いますが、長期的に見た場合の最善の解決策は、時々 exit() 呼び出しを使用するのではなく、関数から常に戻るようにプログラムflexを変更することです。エラー状態が発生した場合、フレックス関数は別の戻り値を使用してこの情報を呼び出し元に渡します。

于 2012-11-13T16:00:39.190 に答える