2016-04-01 8 views
3

Bağlam:<bool*> yeniden kayıt dışı belleğe yeniden girme güvenli midir?

shm_open aracılığıyla iki işlem arasında paylaşılan bir bellek parçam var. ftruncate ing ve mmap'dan sonra, tüm parçanın 00000... bit desenine sahip olduğu garanti edilir. İki süreç boyunca bir boole değeri paylaşmalıyım.

Daha somut bir soru:

makul POSIX sistemlerinde (sav başarısız olmaz ve UB oluşmaz) tamam olması garanti aşağıdaki mı?

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

Ben bool içinde yaşayabileceği gerçek değerler üzerinde bazı kısıtlamalar vardır inanıyoruz, bu yüzden emin değilim. Bu sorunun this one'dan farklı olduğunu düşünüyorum çünkü reinterpret_cast, C stili kalıpların yaptığı aynı tür dönüşümleri yapmıyor.

+0

Teknik olarak, yerleştirme-yeni kullanarak yeni bir nesne oluşturmanın dışında malloc'd alanda herhangi bir şey yapmak için C++ 'da tanımlanmamış bir davranıştır. Şahsen bunu standartta bir kusur olarak görüyorum ve kodunuzun çalışmasını beklerim. BTW burada 'static_cast' kullanabilirsiniz. –

+0

@ M.M: Teşekkürler, teşekkürler! –

+1

@ M.M .: Aslında, yeterli boyutta depolama ve doğru hizalama elde edilir edilmez, önemsiz başlatma ile (bu 'bool' içerir) bir nesne vardır. Bu, aynı türden bir değer (katı takma kuralı) kullanarak ona yazana kadar belirsiz bir değer içermesi gerektiğini düşünmeniz gerektiğini söyledi. –

cevap

1

çekirdek sorunu - bile belleğin tamamen sıfırlı, geçerli bir düzgün bool başlatılmak sanki dan ondan okumaktır - this question için aynıdır.

Uzun lafın kısası:, ortak sistemlerde çalışan ancak taşınabilirliği garanti edilmeyen tanımsız davranışıdır. Standart uygulamaların tanımlanamayan standartlar için davranışlarını belgelemesine izin verilir, bu yüzden önem verdiğiniz belirli platformlar/derleyiciler için biraz araştırma yapmaya değer.

+0

Gerçekten * tanımsız * davranış mı, yoksa sadece * belirtilmemiş değerler mi? – Cornstalks

+0

Değerin kendisi en iyi şekilde * başlatılamadı *, uygun C++ başlatmadan geçmediği için, buradan okuma yapılarak - bool * my_bool = reinterpret_cast (my_shared_memory_region); - tanımlanmamış davranış. İlginç bir şekilde, C++ 11 Standardındaki dipnot 48), tanımlanmamış davranışların ortaya çıkabileceği bir yöntemi açıklamakta zorlanır: * "Bir" bool "değerini, bu Uluslararası Standart tarafından" undefined "olarak tanımlanan şekillerde kullanma; başlatılmamış otomatik nesnenin değeri, 'true' veya false 'gibi davranmaya neden olabilir. * –

+0

Bağlantılı soru' belirtilmemiş 'terimini kullanır ("aksi takdirde doğru olmayan bir program yanlış tarafından oluşturulmamış" Bu işlem, ancak 'undefined' (“burun içi şeytanlar, uyumlu bir uygulama, CPU'yu ateşe vermeyi seçebilir, vb.”) yerine, tüm sistemlerde aynı değeri geri getirme garantisi yoktur ”. Örneğiniz zorlayıcıdır, ancak burada açıklanan dil, bunun nazal iblis toprakları olmadığını göstermektedir. –

İlgili konular