簡體   English   中英

從C ++ 17開始,使用std :: launder“驗證”非“指向對象的指針”指針值

[英]Using std::launder to “validate” non “pointer to object” pointer value since C++17

根據這個答案 ,從C ++ 17開始,即使指針具有正確的地址,並且正確的類型解除引用它也會導致未定義的行為

 alignas(int) unsigned char buffer[2*sizeof(int)];
 auto p1=new(buffer) int{};
 auto p2=new(p1+1) int{};
 *(p1+1)=10; // UB since c++17

原因是p1+1的指針值是對象的指針過去 可以使用std::launder將此示例恢復為已定義的行為:

 *std::launder(p1+1)=10; // still UB?  

其次,在下列情況下它是否也有用?

alignas(int) unsigned char buffer[3*sizeof(int)];
auto pi = new (buffer) int{};
auto pc = reinterpret_cast<unsigned char*>(pi);//not a "pointer to" an element of buffer 
                                               //since buffer[0] and *pc 
                                               //are not pointer interconvertible
//pc+2*sizeof(int) would be UB
auto pc_valid = std::launder(pc) //pc_valid is a pointer to an element of buffer
auto pc_valid2 = pc_valid+2*sizeof(int); //not UB thanks to std::launder
auto pi2 = new (pc_valid2) int{};

否。構成int對象p2的字節指向不能通過p1+1 到達


“可達”規則基本上意味着launder器不允許您訪問通過原始指針無法合法訪問的存儲。 由於不透明函數可以根據需要launder指針,因此允許這種惡作劇將基本上抑制逃逸分析。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM