2017-04-12 2 views
1

Kommentare sind über boost::asio bestreut, die sagen:Wie kann boost :: asio :: buffer_cast die Typ-Sicherheit verletzen?

Die boost :: asio :: buffer_cast Funktion Verletzungen vom Typ Sicherheit erlaubt, so Verwendungen es in Anwendungscode sollte sorgfältig in Betracht gezogen werden.

jedoch letztlich, was die Puffer Schnittstelle läuft darauf hinaus, ist dies:

struct buffer { 
    void *data; 

    friend void* cast_helper(const buffer& b); 
}; 

void* cast_helper(const buffer& b) { 
    return b.data; 
} 

template <typename to_t> 
to_t buffer_cast(const buffer& b) { 
    return static_cast<to_t>(cast_helper(b)); 
} 

static_cast ein void* zu einem Zeigertyp ist gut definiert und als die entsprechende Sache für void* Daten zu tun (siehe " Sollte ich "static_cast" oder "reinterpret_cast" verwenden, wenn ich eine void * auf irgendwas "lege"). Was bedeutet es also, wenn man die Typsicherheit verletzt?

Antwort

2

Betrachten Sie den folgenden Code ein:

char i = 2; 
    buffer b; 
    b.data = &i; 
    double *pd = buffer_cast<double*>(b); 

    *pd = 1.0; 

Diese richtig kompilieren, aber es ruft offensichtlich nicht definiertes Verhalten. Es ist nicht anders wirklich:

char i = 2; 
    void *pv = &i; 
    double *pd = static_cast<double*>(pv); 
    *pd = 1.0; 

sowohl im Fall von static_cast und buffer_cast Rezensent sorgfältig Recht der Besetzung ist, um sicherzustellen, den Code zu suchen braucht.

static_cast Mit einem void* auf einen Zeigertyp zu konvertieren ist nur gut definiert, wenn die void * ursprünglich von einem Zeiger dieser Art oder etwas ähnliches (wo „ähnliche“ erhalten wurde, enthält einige, aber nicht alle, Base/abgeleitete Beziehungen und unsigned char vs plain char vs signiert char, etc).