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