So langsam macht sich Ernüchterung breit. Ich war nicht der erste, der diesem Bug begegnet ist, es gibt die Tickets RSP-15737 und RSP-15497. RSP 15497 kommt von mir.
Das nächste Feature ist auch wieder großes Kino:
struct RecordHeader
{
unsigned char HeaderID;
unsigned short RecordID;
unsigned int RecordSize;
unsigned char CompressionType;
RecordHeader() :
HeaderID( 0 ),
RecordID( 0 ),
RecordSize( 0 ),
CompressionType( 0 )
{
}
};
RecordHeader read_record_header( StreamReader& Reader )
{
RecordHeader Header;
unsigned int BytesRead = Reader.read_exact( &Header, sizeof( Header ) );
if( Header.HeaderID != BeginningOfHeaderID )
{
throw runtime_error( "blah blah blah" );
}
return Header;
}
Der BCC32C wendet hier immer und in jeder Konfiguration NRVO an, d.h. man sieht die Variable Header in der Funktion nicht. Nie. Nicht nur ich sehe sie nicht, auch der Debugger sieht sie nicht. Man hat keine Chance sich die gelesenen Daten anzuschauen, selbst mit dem Variableninspektor kommt man nicht ran. Ist nicht nur in diesem Fall so, sondern jedes Mal, wenn RVO oder NRVO möglich ist. Oder wenn das Ergbnis einer Funktion nicht über den Stack sondern über ein Register zurückgegeben wird. Macht das Debuggen schwierig bis unmöglich. Ich bin begeistert.
Ich frage mich auch so langsam, inwiefern Embarcadero da in Regress genommen werden kann. Was die da verkaufen ist ein großer Sack heiße Luft.