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バイトが原因で、プログラムがそのテキストファイルを読み取るときにクラッシュするか、別の理由がありますか?
マニュアルページ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++ライブラリ内のどこかで使用されており、無効なデータからトリガーされる不可能な状況のチェックがあることを示しているようです。