Yves
Yves

Reputation: 12381

What is the difference between SIGABRT and SIGSEGV

I made the core dumped error with the two pieces of codes below:

//test.cpp
int main()
{
    int *p = new int;
    *p = 100;
    delete p;
    delete p;
    return 0;
}

//test2.cpp
int main()
{
    int *p = new int;
    *p = 100;
    delete p;
    *p = 111;
    std::cout<<*p<<std::endl;
    return 0;
}

Gdb told me that the first piece of code got core dumped because of the signal SIGABRT, whereas the second piece of code got core dumped because of the signal SIGSEGV.

Could you tell what is the difference?

Upvotes: 7

Views: 8716

Answers (3)

Fantastic Mr Fox
Fantastic Mr Fox

Reputation: 33904

Both of these examples are undefined behaviour, this means according to c++ the compiler (and system) can do whatever it wants.

  • In case 1, there is likely a check for the double delete of a pointer, therefore SIGABRT is signaled. SIGABRT means abnormal termination condition, as is e.g. initiated by abort().
  • In case 2, the system detects your deference of a deleted pointer and creates a SIGSEGV signal. SIGSEGV means invalid memory access (segmentation fault)

But both are still UB, so this is just a feature of your current compiler/os/system. The difference between the errors is clear from the definition of the errors here. One is an abort, usually generated by the compiler or coder. One is caused by invalid memory access, usually signaled by the operating system or hardware.

Upvotes: 3

bruno
bruno

Reputation: 32596

The SIGABRT is explicitly detected and signaled by the implementation of delete whose detected the invalidity of the second delete. It is launch by calling the abort function

The SIGSEGV is different, it is undergoing rather than detected by a check in a library like the previous, it is launch through the memory management of the OS

see https://en.cppreference.com/w/c/program/SIG_types

Upvotes: 5

P.W
P.W

Reputation: 26800

Deleting a pointer twice is undefined behavior, which means anything can happen. In this case, it results in the SIGABRT signal being issued.

Accessing memory which does not belong to the program is also undefined behavior which in this case results in segmentation fault and SIGSEGV is issued.

  • SIGABRT indicates an error detected by the program itself and reported by calling abort.
  • SIGSEGV indicates an invalid access to valid memory.

Upvotes: 3

Related Questions