Мне интересно, действительно ли фатальные ошибки LLVM "фатальны" - ie. они делают недействительным все состояние системы и не подлежат восстановлению.
Например (я использую интерфейс llvm- c), поведение по умолчанию следующего кода:
LLVMMemoryBufferRef mb = LLVMCreateMemoryBufferWithMemoryRange(somedata, data_length, "test", 0);
LLVMModuleRef module;
if (LLVMParseBitcode2(mb, &module) != 0) {
fprintf(stderr, "could not parse module bitcode");
}
означает, что если указатель somedata
указывает на недопустимый битовый код, fprintf никогда не выполняется, но вместо этого весь процесс прерывается со своим собственным сообщением о фатальной ошибке на stderr.
Однако, предположительно, существует интерфейс для лови такие ошибки: LLVMFatalErrorHandler
. Однако после установки обработчика ошибок процесс все равно просто прерывается без вызова обработчика ошибок.
Документация в LLVM в целом очень плохая, а интерфейс C практически не документирован. Но кажется, что в супер-fr agile дизайне весь процесс принудительно прерывается, если какой-то битовый код поврежден!
Итак, мне интересно, подразумевает ли здесь «фатальный», как обычно, что если возникает такая ошибка, мы не можем восстановить и продолжать использовать библиотеку (например, пробовать другой битовый код или, например, восстанавливать старый), или если это не действительно «фатальная» ошибка, и мы можем получить FatalErrorHandler
или какие-либо другие средства отлова и уведомления, или предпринять другие действия по исправлению и продолжить программу.