Mutex Init Crash

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Mutex Init Crash

    Hallo zusammen!
    Ich portiere gerade ein reines C-Programm von Intel und XCode 11 nach M1 und XCode 12.5. Soweit geht das recht gut und zumindest im Debug-Mode läuft alles wunderbar.
    Im Release-Mode hingegen gibts einen Fehler bei dem ich nicht weiter weiß.

    Folgender Code...

    pthread_mutex_t m;
    int result = pthread_mutex_init(&m, NULL);

    ...führt zum Absturz gleich beim Start mit der Meldung:

    ThreadSanitizer:DEADLYSIGNAL
    ==1294==ERROR: ThreadSanitizer: BUS on unknown address 0x0001206ca11d (pc 0x00019e83d49c bp 0x0001027acb24 sp 0x00016db45bf0 T38172)
    #0 pthread_cond_init <null>:41890880 (libsystem_pthread.dylib:arm64e+0x549c)

    Hat jemand eine Idee woran das liegt ?

    Gruß
    Thomas
  • Hab gesehen, dass der Fehler eigentlich ein paar Zeilen später auftritt als angenommen. Dort kommt nämlich das pthread_cond_init. Allerdings erzeugen die Zeilen dazwischen kein Output mehr bevor das Programm abschmiert. Also scheint es so als wäre das mutex_init die letzte Zeile, die ausgeführt wird. Soweit sogut.
    Die korrekte Crash-Zeile sieht so aus:

    pthread_cond_init(&d->condition, NULL);

    Es scheint also das d->condition nicht gültig zu sein obwohl das d als ptr auf eine gültige c-struct existiert. Hmm...
    Wie gesagt tritt das Problem nur im Release-Mode auf. Ich werd mal die Codeoptimierung abschalten. Igrnd sowas muss es ja sein. Schließlich ist der Unterschied zum Debug-Mode überschaubar.
  • Nach einigem Herumspielen erscheint neuerdings eine andere Fehlermeldung, die endlich den entscheidenden Hinweis gibt:
    Das ist ein Problem des memory alignements. Die Adressen der Pointer von Mutex und Condition müssen ein Vielfaches eines bestimmten Wertes sein. Dann gehts.
    Welcher Wert das ist, muss ich noch rausfinden. Vermutlich 8 oder 16.
    In meinem besonderen Fall ist die struct nicht standalone alloziert sondern Teil eines größeren Speicherblocks wodurch manche struct-Felder scheinbar krumme Werte bekommen.