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