2016-11-23 2 views
1

Wir haben ein Problem beim Strukturspeicher und Ausrichtung.Clang und Visual C++ - Struct Alignment Kompatibilitätsprobleme

Android ist nicht die # pragma pack (push, <n>), die in mehreren hundert Orten in unserer Code-Basis ist. Dies verursacht einen segfault.

Der Android Clang-Compiler erfordert ein __ Attribut __ Dekorateur auf der Struktur oder Klasse, zum Beispiel:

struct __attribute__((packed, aligned(8))) Test 
{ 
    char a; 
    char b; 
    double d; 
}; 

Wie für Visual C++ zu diesem Gegensatz, der die Pragma ehrt:

#pragma pack(push, 8) 
struct Test 
{ 
     char a; 
     char b; 
     double d; 
}; 
#pragma pack(pop) 

Seit die Verwendung von #pragma pack ist so weit verbreitet, dass es eine zeitraubende Aufgabe ist, dies zu beheben.

Wir haben versucht, das Compiler-Flag -mms-bitfields zu verwenden, das das Standardstrukturlayout so einstellt, dass es mit dem Compilerstandard von Microsoft kompatibel ist (d. H. Es berücksichtigt das Paket #pragma). Dies funktioniert jedoch nur für triviale Strukturen und nicht für Klassen mit Basisklassen oder virtuellen Funktionen. Wir erhalten den folgenden Fehler mit dieser Art von Klassen.

„Fehler: ms_struct kann nicht Microsoft-kompatible Layouts für Klassen mit Basisklassen oder virtuellen Funktionen erzeugt [-Wincompatible-ms-Struktur]“

Wie können wir dieses Problem mildern - gibt es eine Abhilfe # machen Pragma Pack funktioniert für nicht-triviale Strukturen/Klassen anders als über alle Klassen/Strukturen zwischen Push- und Pop-Pragmas zu gehen und das gepackte Attribut hinzuzufügen?

Dank

Antwort

2

aller Zuerst habe ich den Eindruck, dass Sie etwas grundlegend falsch machen, wenn Sie auf „mehrere hundert Stellen“ in Ihrem Code haben, wo Sie die Ausrichtung definieren müssen eine segfault zu verhindern. Dieses Pragma ist nicht Standard und es ist nicht weit verbreitet es zu benutzen. Am auffälligsten ist es nicht weit verbreitet, es so umfangreich zu nutzen, wie Sie es tun. Es ist auch nicht im Standard.

Wie auch immer, da clang das Pragma ignoriert und msvcc die Attribute ignoriert, würde ich beide in den Code eingeben. Sie könnten z.B. grep und sed um viel manuelle Arbeit zu verhindern.

+0

Es ist eine sehr lange lebende Code-Basis, also denke ich, dass Dinge wie das passieren werden, und yeah, ich habe grep/sed oder ein dediziertes Skript gesammelt, ist wahrscheinlich der Weg zu gehen. Danke, mal sehen, ob jemand anderes auf ein solches Problem gestoßen ist und vielleicht einen anderen Vorschlag hat. –