zakerna zahada GCC

Jaroslav Buchta jaroslav.buchta na hascomp.cz
Středa Únor 7 14:56:25 CET 2018


Mam datovy typ:

typedef union
{
     struct {
         uint8_t b[32];
     } ba;

     struct {    //common all records (chained records exception)
         uint32_t id;            // id MSb == 0
         uint32_t tstp[2];
     }cmn;

     struct {    //Text Single or Start Record
         uint32_t id;            // id MSb == 0
         uint32_t tstp[2];        //timestamp in miliseconds, record 
type FLCLOG_RT_* at 4 MSbs
         uint8_t  sendRq;        //send to server request
         uint8_t  text[19];    //content, max length
     }recTxt;

...

}FLCLOGRECORD;

Pokud napisu podminku

for (int idx=0; rec.recTxt.text[idx] != 0 && idx < 
sizeof(rec.recTxt.text); idx++)

tak se to vykasle na druhou cast a index klidne leze na 19 a vic dokud 
neni v pameti nahodou nula (kopiruje to strin ktery muze ale nemusi 
koncit 0) Uz vim, ze je to v principu spatne a prvni cast si sahne mimo 
rozsah pole, ale ze by to prekladac poresil takto?

Kdyz podminky prehodim

for (int idx=0; idx < sizeof(rec.recTxt.text) && rec.recTxt.text[idx] != 
0; idx++)

Tak to funguje OK ale uz jsem nemel cas zkoumat disassembler. V 
neoptimalizovanem kodu to fungovalo i pro prvni variantu.

Vysvetli to chovani nekdo?



Další informace o konferenci Hw-list