Od úterý 28. dubna musí nově uváděné notebooky v Evropské unii podporovat nabíjení přes USB-C. Jednotná nabíječka byla schválena Evropským parlamentem v říjnu 2022.
Byly publikovány informace o kritické zranitelnosti CVE-2026-31431 pojmenované Copy Fail v Linuxu, konkrétně v kryptografii (AF_ALG). Běžný uživatel může získat práva roota (lokální eskalaci práv). Na všech distribucích Linuxu vydaných od roku 2017. Pomocí 732bajtového skriptu. V upstreamu je již opraveno. Zranitelnost byla nalezena pomocí AI Xint Code.
Textový editor Zed dospěl do verze 1.0. Představení v příspěvku na blogu.
Vývojáři svobodného 3D softwaru Blender představili (𝕏, Mastodon, Bluesky) nejnovějšího firemního sponzora Blenderu. Je ním společnost Anthropic stojící za AI Claude a úroveň sponzoringu je Patron, tj. minimálně 240 tisíc eur ročně. Anthropic oznámil sponzorství v tiskové zprávě Claude for Creative Work.
VNC server wayvnc pro Wayland kompozitory postavené nad wlroots - ne GNOME, KDE nebo Weston - byl vydán ve verzi 0.10.0. Vydána byla také verze 1.0.0 související knihovny neatvnc.
Bylo oznámeno vydání Fedora Linuxu 44. Ve finální verzi vychází šest oficiálních edic: Fedora Workstation a Fedora KDE Plasma Desktop pro desktopové, Fedora Server pro serverové, Fedora IoT pro internet věcí, Fedora Cloud pro cloudové nasazení a Fedora CoreOS pro ty, kteří preferují neměnné systémy. Vedle nich jsou k dispozici také další atomické desktopy, spiny a laby. Podrobný přehled novinek v samostatných článcích na stránkách
… více »David Malcolm se na blogu vývojářů Red Hatu rozepsal o vybraných novinkách v GCC 16, jež by mělo vyjít v nejbližších dnech. Vypíchnuta jsou vylepšení čitelnosti chybových zpráv v C++, aktualizovaný SARIF (Static Analysis Results Interchange Format) výstup a nová volba experimental-html v HTML výstupu.
Byla vydána verze R14.1.6 desktopového prostředí Trinity Desktop Environment (TDE, fork KDE 3.5, Wikipedie). Přehled novinek v poznámkách k vydání, podrobnosti v seznamu změn.
Jon Seager z Canonicalu včera na Ubuntu Community Hubu popsal budoucnost AI v Ubuntu. Dnes upřesnil: AI nástroje budou k dispozici jako Snap balíčky, vždy je může uživatel odinstalovat. Ve výchozím nastavení budou všechny AI nástroje používat lokální AI modely.
Nový ovladač Steam Controller jde do prodeje 4. května. Cena je 99 eur.
Příběh o tom, jak probíhá hledání a opravování chyby v autorovi dosud neznámém kódu, vypráví článek Opravujeme chyby v softwaru: inotify-tools. Krok za krokem stáhneme zdrojové kódy, přeložíme program a najdeme chybu – seznámíme se se základními postupy a nástroji pro diagnostiku chyb (verzovací systém, IDE, GNU Debugger, Kompare).
Tiskni
Sdílej:
vim ~/.emacs
for ( i = 0; i < strlen(string); ++i ) {
autoři si s optimalizacemi moc hlavu nedělali. Je to o vyhnutí se dynamické alokaci (o 4kB poli v lokální proměnné nemluvě).
Na githubu mají dobrou opravu:
Do not double escape names. Fixes #36
S tou předčasnou optimalizací je trochu vedle. Jak je vidět z
Asi optimalizovali na obsazenou paměť ne na výkon, ale vyústilo to v to, že si paměť nechtěně přepisovali. To už mi snad přijde lepší, když tam bude únik paměti a program je nakonec sestřelen OOM killerem, než aby tam byla potenciálně bezpečnostní díra v podobě přetečení.
Samozřejmě ideál je to napsat tak, aby paměť neunikala, žralo jí to třeba o něco víc, ale konstantně, a bylo to bezpečné.
for ( i = 0; i < strlen(string); ++i ) {
Někdy se iteruje v opačném směru, k nule, což je trochu nezvyk, ale vlastně proč ne (pokud nezáleží na pořadí).
Nebo si klasicky uložit délku do proměnné.
o 4kB poli v lokální proměnné nemluvě
A jak by to mělo být správně? Alokovat dvojnásobek délky vstupu + uvozovky a nulový bajt? (jak navrhuje Kruci pod článkem) Nebo si alokovat nějakou dynamickou strukturu (jakou?) o velikosti tak 120 % vstupu, protože tam se to většinou vejde (a případně se ještě zvětší).
Do not double escape names. Fixes #36
Njn, chyba tam zůstala dál, jen se přestala projevovat.
for ( i = 0; i < strlen(string); ++i ) {Někdy se iteruje v opačném směru, k nule, což je trochu nezvyk, ale vlastně proč ne (pokud nezáleží na pořadí).
Nebo si klasicky uložit délku do proměnné.
Se zapnutými optimalizacemi by měl překladač toereticky uložit výsledek strlen(string) do neviditelné automatické dočasné proměnné (popř. registru) a tu používat v cyklu, i když osobně bych na to raději nespoléhal - překladač musí mít jistotu, že vrácená hodnota je konstantní po celou dobu cyklu (tj. např. žádná pointerová aritmetika nebo předávání dalším funkcím, pokud není parametr const), v opačném případě bude volat strlen(string) při každém průchodu. Když už si někdo nechce zaplácávat zásobník, může proměnné použité k uchování délky řetězce nastavit jako register a doufat, že to překladač pochopí správně a nebude jí alokovat žádnou paměť.
A i když iterovat "pozadu" je sice z algoritimického hlediska ekvivaltení iterování směrem vpřed, procesor, cache a paměti apod. jsou dělané na to, že se paměť čte směrem dopředu, ne odzadu (viz prefetch),
vsprintf(), ta zajímavá funkce se jmenuje realloc(). Na začátku si alokuješ těch 120% a když to nebude stačit, tak jen string = realloc(string, 2 * strlen(string)) a hotovo.
assert, že char *string náhodou nesměřuje někam do csv[]
Jenže pak by nešlo escapovat dvakrát. V tomto programu to asi není potřeba, ale jinak se to hodí (např. když chci někam vložit ukázku, jak vypadá escapovaný kód).
Pro mě má funkce prostě nějaký definiční obor a nějakou návratovou hodnotu a můžu ji zanořit třeba stokrát a pořád by měla fungovat. Proč by měla mít takové omezení jenom kvůli tomu, jaký jazyk jsem si pro implementaci vybral?
Dobré řešení asi je předávat ten buffer zvenku jako parametr a uvnitř nic nealokovat, ale pak to zase není funkce, ale spíš procedura.
Dobré řešení asi je předávat ten buffer zvenku jako parametr a uvnitř nic nealokovat, ale pak to zase není funkce, ale spíš procedura.Hlavne nevis jak velky ho budes potrebovat.
To je pravda – musím znát implementační detaily té funkce (od kterých bych měl normálně abstrahovat), abych určil maximální velikost výstupu. Jak to tedy napsat správně?
Na tom mi nesedí, že se paměť uvolňuje někde jinde, než kde byla alokována, resp. že je za to odpovědný někdo jiný a je to hodně náchylné k chybám. Ale asi je to v C normální…
.
BTW: dá se to nějak automaticky analyzovat nebo to musí všechno pročítat člověk? Odhalí nějaký nástroj tyhle problémy?