2016-04-01 11 views
3

Kontext:Ist es sicher zu reinterpret_cast <bool*> Null-Speicher?

Ich habe einen Teil des Speichers, der über shm_open zwischen zwei Prozessen gemeinsam genutzt werden. Ich bin garantiert, dass nach ftruncate ing und mmap ing es, das ganze Stück hat das Bitmuster 00000.... Ich muss einen booleschen Wert über die beiden Prozesse teilen.

Eine konkretere Frage:

Ist das in Ordnung sein folgendes garantiert (die Behauptung nicht ausfällt und UB nicht auftritt) auf vernünftigen POSIX-Systemen?

void *my_shared_memory_region = calloc(1024, 1); 
bool *my_bool = reinterpret_cast<bool*>(my_shared_memory_region); 
assert(*my_bool == false); 

Ich glaube, dass einige Einschränkungen auf den tatsächlichen Werten gibt, die innerhalb eines bool leben kann, so dass ich bin mir nicht sicher. Ich denke, diese Frage unterscheidet sich von this one, weil reinterpret_cast nicht die gleiche Art von Konvertierungen, die C-Style-Casts tun, tun.

+0

Technisch ist es undefiniertes Verhalten in C++, etwas in Malloc'd Space zu tun, außer ein neues Objekt mit Placement-Neu zu erstellen. Persönlich betrachte ich dies eher als einen Fehler im Standard und würde erwarten, dass Ihr Code funktioniert. BTW können Sie 'static_cast' hier verwenden. –

+0

@ M.M: Whoops, danke! –

+1

@ M.M .: Tatsächlich existiert ein Objekt mit trivialer Initialisierung (das schließt "bool" ein), sobald ein Speicher von ausreichender Größe und korrekter Ausrichtung erhalten wird. Das heißt, Sie müssen berücksichtigen, dass es einen unbestimmten Wert enthält, bis Sie mit einem lvalue desselben Typs schreiben (strikte Aliasing-Regel). –

Antwort

1

Die Kernfrage - selbst wenn die alle Nullen Speicher, ist es gültig ab, es zu lesen, als ob von einem richtig bool initialisiert - ist die gleiche wie für this question.

Long Story kurz: es ist undefined Verhalten, die auf gängigen Systemen funktioniert, ist aber nicht tragbar garantiert. Bestimmte Implementierungen können das Verhalten für Fälle dokumentieren, die der Standard nicht definiert hat. Daher lohnt es sich, einige Nachforschungen für die spezifischen Plattformen/Compiler anzustellen, die Ihnen wichtig sind.

+0

Ist es wirklich * undefined * Verhalten oder sind die Werte nur * nicht spezifiziert *? – Cornstalks

+0

Der Wert selbst könnte am besten als * nicht initialisiert * bezeichnet werden, da er nicht die richtige C++ Initialisierung durchlaufen hat, was das Lesen daraus macht - durch 'bool * my_bool = reinterpret_cast (mein_shared_memory_region);' - undefiniertes Verhalten. Interessanterweise stößt die Fußnote 48) im C++ 11 Standard darauf, eine Art zu beschreiben, in der sich das undefinierte Verhalten manifestieren könnte: * "Verwendung eines' bool'-Wertes in der von dieser Internationalen Norm beschriebenen Weise als "undefiniert", z Der Wert eines nicht initialisierten automatischen Objekts kann dazu führen, dass es sich so verhält, als wäre es weder 'true' noch' false'. "* –

+0

Die verknüpfte Frage verwendet den Begriff 'unspezifiziert' (" ein ansonsten korrektes Programm wird nicht falsch dargestellt diese Operation, aber es ist nicht garantiert, den gleichen Wert auf allen Systemen ") im Gegensatz zu" undefined "(" nasale Dämonen, eine konforme Implementierung kann wählen, um Ihre CPU in Brand setzen, etc "). Ihr Beispiel ist überzeugend, aber die dort beschriebene Sprache deutet stark darauf hin, dass dies kein nasales Dämonengebiet ist. –

Verwandte Themen