Ошибка шины и ошибка сегментации

Разница между ошибкой шины и ошибкой сегментации? Может случиться так, что программа выдаст ошибку seg и остановится в первый раз, и во второй раз она может вызвать ошибку шины и выйти?

Ответ 1

В большинстве архитектур, которые я использовал, различие заключается в следующем:

  • SEGV возникает при доступе к памяти, к которой вы не предназначаетесь (например, вне вашего адресного пространства).
  • SIGBUS вызван из-за проблем с выравниванием с ЦП (например, попытка прочесть длинный адрес, который не является кратным 4).

Ответ 2

SIGBUS также будет поднят, если вы mmap() файл и попытаетесь получить доступ к части отображаемого буфера, который продолжается до конца файла, а также для условий ошибки, например, вне пространства. Если вы зарегистрируете обработчик сигнала, используя sigaction(), и вы установите SA_SIGINFO, возможно, ваша программа проверит адрес неисправной памяти и обрабатывать только файлы с ошибками памяти.

Ответ 3

Например, ошибка шины может быть вызвана, когда ваша программа пытается сделать то, что аппаратная шина не поддерживает. В SPARC, например, пытаясь прочитать многобайтовое значение (например, int, 32 бит) из нечетного адреса, сгенерированного шиной ошибка.

Ошибки сегментации происходят, например, когда вы выполняете доступ, который нарушает правила сегментации, т.е. пытается прочитать или записать память, которой вы не являетесь.

Ответ 4

Я предполагаю, что вы говорите о сигналах SIGSEGV и SIGBUS, определенных Posix.

SIGSEGV возникает, когда программа ссылается на неверный адрес. SIGBUS - ошибка аппаратного обеспечения, определяемая реализацией. Действие по умолчанию для этих двух сигналов - это прекращение программы.

Программа может захватывать эти сигналы и даже игнорировать их.

Ответ 5

Интерпретация вашего вопроса (возможно, неверно), что означает "Я периодически получаю SIGSEGV или SIGBUS, почему это не так?", стоит отметить, что выполнение хитроумных вещей с указателями не гарантируется стандартами C или С++ привести к segfault; это просто "поведение undefined", которое, как сказал один из профессоров, когда-то это означало, что вместо этого он может заставить крокодилов выйти из половиц и съесть вас.

Таким образом, ваша ситуация может заключаться в том, что у вас есть две ошибки, в которых первое происходит, иногда вызывает SIGSEGV, а второе (если segfault не произошло и программа все еще работает) вызывает SIGBUS.

Я рекомендую вам пройти через отладчик и искать крокодилов.

Ответ 6

Это будет dup Что такое ошибка шины?, если бы это было не для

Может случиться так, что программа выдает ошибку seg и останавливается в первый раз, а во второй раз может возникнуть ошибка шины и выйти?

часть вопроса. Вы должны быть в состоянии ответить на этот вопрос с информацией, найденной здесь.


Безумие: повторять одно и то же снова и снова и ожидать разные результаты.
- Альберт Эйнштейн


Конечно, беря вопрос буквально...

#include <signal.h>
#include <stdlib.h>
#include <time.h>
#include <unistd.h>
int main() {
    srand(time(NULL));
    if (rand() % 2)
        kill(getpid(), SIGBUS);
    else
        kill(getpid(), SIGSEGV);
    return 0;
}

Tada, программа, которая может выйти с ошибкой сегментации на одном прогоне и выйти с ошибкой шины в другой перспективе.