zakerna zahada GCC

Richard Kaliciak hw.kaliciak na stonline.sk
Středa Únor 7 17:20:47 CET 2018


Dobry den,

Jano by ma mozno zabil, ak by som ti poradil, ze definuj text[19] ako
volatile, ako sa to s oblubou robi, ked nastanu "chyby" po optimalizacii
prekladu.

Richard Kaliciak

Am 07.02.2018 um 17:09 schrieb Jaroslav Buchta:
> 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
>>
>>
>
> _______________________________________________
> 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