zakerna zahada GCC

Jaroslav Buchta jaroslav.buchta na hascomp.cz
Středa Únor 7 17:09:45 CET 2018


Me jde o pripad, kdy je leva podminka splnena a idx uz ma hodnotu treba 
19, 20... coz podminku nesplnuje (pokud jsem neco neprehlednul) a 
iterace se provede. Dle disassebleru neni druha cast podminky vubec 
zohlednena, testuje se jen znak v retezci na 0.
Kopirovani tady musim provadet po znaku, pridavaji se do dynamicky 
alokovaneho pole s nejakou inteligenci a tady neni kvalt.
S dosazenim funkcnosti si poradim, spis si to potrebuju vysvetlit, tento 
problem se muze vyskytnout i jindy a jinde.

Dne 07.02.2018 v 16:15 Jindroush napsal(a):
> Dobry den,
> nejsem si ted jist, jestli jsem pochopil spravne problem, ale podle 
> mne mluvite o vlastnosti C, tj. short-circuitingu AND operatoru. Staci 
> vyhodnotit levou cast a jde se dal, na poradi podminek zalezi. To je 
> dulezite si uvedomit i u funkci, ktere maji vedlejsi efekty.
>
> Jinak ten vas kod nezaruci zero-termination, nebo ano?
>
> Fungovat v debugu by to nemelo, jen to nesletelo, protoze tam byla 
> jinak a jinde alokovana pamet.
>
> Co vam brani pouzit bezpecnou knihovni alternativu - strlcpy?
> (Pripadne ji nekde obslehnout).
>
> J.
>
> On 7.2.2018 14:56, Jaroslav Buchta wrote:
>> 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?
>>
>> _______________________________________________
>> HW-list mailing list  -  sponsored by www.HW.cz
>> Hw-list na list.hw.cz
>> http://list.hw.cz/mailman/listinfo/hw-list
>
>



Další informace o konferenci Hw-list