[C]Podivnosti,Was: malloc/free

Josef Štengl ok1ced na nagano.cz
Čtvrtek Listopad 3 12:44:29 CET 2016


Ano memmove umožnuje kopírování i překrývajících se oblastí. Jestli funkce umožňuje kopírování nebo přesun překrývajících 
se oblastí záleží v C na implementaci funkce. Běžně nebývají.

Pokud máte novější kompilátor, je v prototypech knihovních funkcí uvedeno klíčové slovo restrict u parametru s ukazatelem. 
To říká, že se předpokládá, že se oblasti zájmů (tedy dat, objektů) nebudou pro zápis překrývat a kompilátor může použít 
agresivnější optimalizaci. Pokud se budou překrývat je chování nedefinováno. Fce strcpy() je zrovna příkladem s použitím 
restrict. Ve vašem případě nikdo nebyl varován :-)



Dne 3.11.2016 v 12:14 Hynek Sladky napsal(a):
> Podle me by melo jit pouzit funkci memmove(), ktera umi kopirovat prekryvajici se oblasti...
>
> Hynek
>
>
> Dne 3.11.2016 11:57, Miroslav Mraz napsal(a):
>> A nejen v oblasti mcu. Zrovna včera jsem hledal chybu v jednom projektu - je to jakýsi nástroj pro PLC, jehož historie
>> se zřejmě táhne do časů MSDOS. Tak jsem to chtěl upravit aby to mohlo běžet i v nějakém normálním prostředí (především
>> linux) a narazil jsem - prostě to vyhazovalo chyby. Protože to má celé asi 13000 řádek kódu, chvíli mi trvalo než se
>> podařilo chybu izolovat - ukázalo se, že problém je v knihovní funkci strcpy(char* dest, const char* src), která opravdu
>> do dest uložila něco jiného než bylo původně v src.
>> To bylo docela neočekávané, ale stačí se podívat do manuálu - řetězce se nesmí překrývat. A zde je jádro pudla. Ten, kdo
>> nástroj kdysi tvořil prostě na tohle kašlal. Protože "taky to funguje" a ve windows to opravdu funguje. Nedalo mi to se
>> nepodělit, protože upřímně řečeno takhle někdy "prasím" taky. A kdo ne, ať hodí kamenem.
>>
>> A nevím, zda je to nekompetentnost, lenost nebo se jen věci vyvíjejí a jak už to bývá zvykem, obvykle k horšímu. Protože
>> workaround spočívá v tom, že strcpy() nahradím prostým kopírováním byte po bytu. Což asi původně tak i bylo.
>>
>> Mrazík
>
>
>
> _______________________________________________
> 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