zakerna zahada GCC
Jindroush
jindroush na seznam.cz
Středa Únor 7 16:15:24 CET 2018
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 at list.hw.cz
> http://list.hw.cz/mailman/listinfo/hw-list
--
Jindroush <jindroush at seznam.cz>
Další informace o konferenci Hw-list