HomeBlogMagic

Linux - SIGSEV error

Mir ist es schon einige male passiert dass ich beim ausführen von Programmen einen SIGSEV Error erhalten habe und deshalb das Programm abgestürzt ist.

Ich will euch mal alle potentiellen Fehler die mir untergekommen sind auflisten. Die Anzahl wird steigen mit jedem Fehler den ich gefunden habe.

1. Objekt auf dem stack nicht mehr gültig

Beispiel:

void funcA(const char* pcData)
{
  // do something with data, wich takes long time
}

int main(int iArgC, char** ppcArgV)
{
  if (iArgC > 0)
  {
    funcA(std::string(ppcArgv[0]).c_str());
  }
}

In diesem Beispiel wird aus dem bei der Übergabe an funcA ein string-Object angelegt und im Anschluss auf dessen inhalt zugegriffen.
string erzeugt einen Speicher und dessen Inhalt ist, solange das Objekt existiert, im Speicher gelockt.
Das Problem hierbei, würde das Objekt per Reference übergeben werden, dann wäre für den Compiler klar, dass das Objekt längere Zeit benötigt wird. In diesem Fall übergeben wir aber einen Pointer den das Objekt erzeugt hat, und da auf das Objekt nicht mehr zugegriffen wird, kann es gelöscht werden. So passiert es, dass das Objekt in funcA breits seine Gültigkeit verloren hat. Solange der freie Speicher nicht nochmal belegt worden ist, gibt es keine Probleme. Wenn das aber geschieht, weil ein anderer Thread oder sogar funcA Speicher in diesem Bereich alloziert hat, dann gibt es den SIGSEV Fehler.

Lösung:

void funcA(const char* pcData)
{
  // do something with data, wich takes long time
}

int main(int iArgC, char** ppcArgV)
{
  if (iArgC > 0)
  {
    std::string sTempString(ppcArgv[0]);
    funcA(sTempString.c_str());
  }
}
Permalink: https://adirmeier.de/Blog/ID_109
Tags: Blog, Error, Linux, SIGSEVvon am 2017-05-09