web-dev-qa-db-ja.com

コマンドラインプログラムがSIGABRTによって強制終了されるのはなぜですか?

Vimを使用してプログラムのデータファイルの1つに誤ってnullバイト(^ @)を挿入するまでvimを使用してvim :s(substitute)コマンド。それ以来、プログラムは実行されなくなり、次のエラーが発生します。

/usr/include/c++/9/bits/basic_string.h:1048: std::__cxx11::basic_string<_CharT, _Traits, _Alloc>::const_reference std::__cxx11::basic_string<_CharT, _Traits, _Alloc>::operator[](std::__cxx11::basic_string<_CharT, _Traits, _Alloc>::size_type) const [with _CharT = char; _Traits = std::char_traits<char>; _Alloc = std::allocator<char>; std::__cxx11::basic_string<_CharT, _Traits, _Alloc>::const_reference = const char&; std::__cxx11::basic_string<_CharT, _Traits, _Alloc>::size_type = long unsigned int]: Assertion '__pos <= size()' failed.
Aborted (core dumped)

gnome-abrtは、エラーの理由が次のとおりであることを示しています。

task killed by SIGABRT

具体的にはSIGABRT 6

  • Linuxでは、実行可能ファイルによって読み取られるテキストファイルにnullバイトを挿入するとどうなりますか? nullバイトがプログラムのデータファイルに挿入された方法は、git commitメッセージにnullバイトを挿入した場合と似ており、それによってgitが壊れます。

  • Nullバイトが原因で、プログラムがそのテキストファイルを読み取るときにクラッシュするか、別の理由がありますか?

1
MyWrathAcademia

マニュアルページsignal(7)はこう言っています:

_Signal     Value     Action   Comment
──────────────────────────────────────────────────────────────────────
SIGABRT       6       Core    Abort signal from abort(3)
_

そしてabort(3)

_NAME
abort - cause abnormal process termination

DESCRIPTION
The  abort()  first  unblocks the SIGABRT signal, and then raises that
signal for the calling process (as though raise(3) was called).  This
results in the abnormal termination of the process
_

したがって、SIGABRTによる死は、プログラム自体が中止することを決定したときに発生する可能性が高いです。データの健全性チェックが行われ、データが無効な場合は中止されます。

assert() マクロもabort()を呼び出しますが、発生すると、エラーメッセージに次のビットが含まれます。

_std::__cxx11::basic_string...: Assertion '__pos <= size()' failed.
_

これは、無効な値がC++ライブラリ内のどこかで使用されており、無効なデータからトリガーされる不可能な状況のチェックがあることを示しているようです。

1
ilkkachu