Evropská směrnice NIS2 přináší nové požadavky v oblasti kybernetické bezpečnosti, které se promítají také do správy doménových jmen. Do českého právního řádu je směrnice implementována prostřednictvím nového zákona o kybernetické bezpečnosti. Jedním z praktických důsledků této legislativní změny je posílení požadavků na dostupnost a správnost kontaktních údajů držitelů domén. Správce registru domény .cz, sdružení CZ.NIC, je v
… více »Jonathan Thomas oznámil vydání nové verze 3.5.0 video editoru OpenShot (Wikipedie). Zdrojové kódy OpenShotu jsou k dispozici na GitHubu. Ke stažení je i balíček ve formátu AppImage. Stačí jej stáhnout, nastavit právo na spouštění a spustit.
Byla vydána (𝕏, Bluesky) nová verze 2026.1 linuxové distribuce navržené pro digitální forenzní analýzu a penetrační testování Kali Linux (Wikipedie). Přehled novinek se seznamem 8 nových nástrojů v oficiálním oznámení na blogu.
Vláda jmenovala novým zmocněncem pro digitalizaci a strategickou bezpečnost prvního náměstka ministra vnitra Lukáše Klučku. Ten ve funkci nahradil poslance Roberta Králíčka poté, co Králíček na tento post vládního zmocněnce rezignoval. Klučka chce do roka digitalizovat všechny státní služby tak, aby vyhověly zákonu o právu na digitální služby, přičemž dosavadní plán Fialovy vlády počítal s dokončením digitalizace až někdy v roce
… více »Byl vydán Mozilla Firefox 149.0. Přehled novinek v poznámkách k vydání a poznámkách k vydání pro vývojáře. Vypíchnout lze bezplatnou vestavěnou VPN s 50 GB přenesených dat měsíčně, zobrazení dvou webových stránek vedle sebe v jednom panelu (split view) nebo možnost přidat poznámky k panelům (Firefox Labs). Řešeny jsou rovněž bezpečnostní chyby. Nový Firefox 149 bude brzy k dispozici také na Flathubu a Snapcraftu.
Byly vydány nové verze 5.3.0 a 6.0.0 svobodného multiplatformního programu pro skicování, malování a úpravu obrázků Krita (Wikipedie). Přehled novinek i s náhledy a videi v poznámkách k vydání. Obě verze vycházejí ze stejného zdrojového kódu – rozdíl je v použitých verzích Qt a KDE Frameworks. Krita 6.0.0 je první vydání postavené na Qt 6 a stále je považovaná za experimentální. Má lepší podporu Waylandu. Přináší podporu protokolu Wayland
… více »Byla vydána nová verze 10.2 z Debianu vycházející linuxové distribuce DietPi pro (nejenom) jednodeskové počítače. Přehled novinek v poznámkách k vydání. Vypíchnout lze nové balíčky Immich, Immich Machine Learning, uv a RustDesk Client.
TypeScript (Wikipedie), tj. JavaScript rozšířený o statické typování a další atributy, byl vydán v nové verzi 6.0. Příští verze 7.0 je kvůli výkonu přepisována do programovacího jazyka Go.
Christian Schaller z Red Hatu na svém blogu popsal své zkušenosti s používáním AI při vývoji open source aplikací pro Linux. Pomocí různých AI aktualizoval nebo vytvořil aplikace Elgato Light GNOME Shell extension, Dell Ultrasharp Webcam 4K, Red Hat Planet, WMDock, XMMS resuscitated (aktualizace z GTK 2 a Esound na GTK 4, GStreamer a PipeWire) a Monkey Bubble. SANE ovladač pro skener Plustek OpticFilm 8200i se mu zatím nepovedl.
Americké firmy Tesla a SpaceX postaví v texaském Austinu moderní komplex na výrobu čipů pro umělou inteligenci (AI). Součástí projektu s názvem Terafab budou dvě moderní továrny na výrobu čipů – jedna se zaměří na automobily a humanoidní roboty, druhá na datová centra ve vesmíru. Uvedl to generální ředitel těchto firem Elon Musk. Projekt by podle odhadů měl stát 20 miliard USD (zhruba 425 miliard Kč).
Dnes bude trochu lehčí než minule. Setkal se s tím určitě každý, kdo alespoň přičuchnul k C nebo C++.
void Trim(char *str) {
int zleva; //kolik bílých znaků zleva oříznu
for (zleva = 0; str[zleva] != '\0'; zleva++) {
if (str[zleva] > ' ') break;
}
int i; //zkopíruju zbytek řetězce
for (i = 0; str[i+zleva] != '\0'; i++) {
str[i] = str[i+zleva];
}
//najdu konec řetězce
for (i--; i >= 0 && str[i] <= ' '; i--);
str[i+1] = '\0'; //a oříznu
}
Celkem krátký kód, poměrně lehký, skoro školní úloha. Nicméně, tato funkce nepracuje správně
obsahuje minimálně 2 různé chyby, které způsobují, že existuje vstup, pro který nedává očekávaný výstup.
Najdete je?
Ještě dodávám, že kód můžete i debugovat, ačkoli vám to pravděpodobně moc nepomůže.
Domněnky a řešení pište do komentářů. Vy ostatní se při přemýšlení samozřejmě do komentářů nedívejte
Řešení:if (str[zleva] > ' ') a jdou uřezány společně s bílými znaky. Je to trochu od jazyka C/C++ zrada; sice je znaménkový typ konzistentní se standardní „znaménkovostí“ jiných typů, ale u řetězců toto nemá význam; neumím si představit, kdy bych využil, že ASCII >= 128 je reprezentováno zápornými hodnotami. Naopak je mnoho případů, kdy dochází k chybám a podivným nelogičnostem (viz např. tato ukázka). V Javě jsou třeba všechny typy striktně znaménkové, ale typ char je jediný neznaménkový (16bitový). Taktéž i jiné jazyky nikdy neberou znak jako záporné číslo.
Druhou chybou je použití typu int k indexování. Typ int je 4bajtový (nebo 2bajtový v 16bitovém prostředí) a nehodí se tak pro adresaci paměti. K adresaci paměti je vhodné použít typ size_t (neznaménkový) nebo ptrdiff_t (znaménkový). Tyto typy tak veliké, jak veliký je ukazatel; na 32bitovém mají 4 bajty, na 64bitovým 8 bajtů. V tomto případě by se program v 64bitovém prostředí zacyklil na prvním cyklu při 2 GiB dlouhém řetězci. Na 32bitovém prostředí by pak neořízl řetězec zprava (hned by vyskočil z třetí podmínky).
Tiskni
Sdílej:
3) Na 64bit Linuxu se zacykli se na stringu delsim nez 4 GB :–)
A gratuluji znova, toto je ta druhá chyba
konkrétně se zacyklí i na stringu delším než 2 GiB, a tedy i na 32bit
konkrétně se zacyklí i na stringu delším než 2 GiB, a tedy i na 32bitOpravdu se rozbije i na 32bit systemu? Nejsem si teda presne jist, jak se chova pointerova arimetrika pri preteceni, ale tipoval bych ze to vezme modulo 2^32, takze se to bude prakticky chovat jako by byl index unsigned.
str[i+1] = '\0'; je out of bounds pro prazdny retezec a taky to nefunguje pro retezce ktere jsou jenom z bilych znaku
Netusim jestli to je jedna nebo jsou to dve chyby.
void Trim(char **str)?
void trim(char *str) {
char *begin = str, *end;
while ((unsigned char)*begin <= ' ' && *begin != '\0')
begin++;
end = begin + strlen(begin);
while ((unsigned char)*end <= ' ' && end > begin)
end--;
memmove(str, begin, end - begin + 1);
str[end - begin + 1] = '\0';
}
ale pokud má předaný buffer jen jeden bajt (a tam je koncová nula, čili prázdný řetězec, pak begin = end = str a tudíž poslední řádek zapíše 0 na index 1 => za buffer.
Přiznávám se bez mučení, že úvahu "považujme za bílý znak cokoli s kódem menším nebo rovným 32" jsem bral za natolik nesmyslnou, že jsem si prostě místo toho testu v duchu dosadil isspace() a chybu tudíž neodhalil, protože mne nenapadlo hledat chyták v podobě chybné implementace něčeho, co je samo o sobě chyba.
Mimochodem, určitě je podle normy char znaménkový? Vždycky jsem měl za to, že je na implementaci, jestli bude char totéž co signed char nebo unsigned char, a programátor by tudíž neměl předpokládat ani jedno.
Mimochodem, určitě je podle normy char znaménkový? Vždycky jsem měl za to, že je na implementaci, jestli bude char totéž co signed char nebo unsigned char, a programátor by tudíž neměl předpokládat ani jedno.C99 6.2.5 Types An object declared as type char is large enough to store any member of the basic execution character set. If a member of the *basic execution character set* is stored in a char object, its value is guaranteed to be nonnegative. If any *other character* is stored in a char object, the resulting value is *implementation-defined* but shall be within the range of values that can be represented in that type. 5.2.1 Character sets Both the basic source and basic execution character sets shall have the following members: the 26 uppercase letters of the Latin alphabet, the 26 lowercase letters of the Latin alphabet, the 10 decimal digits, 29 graphic characters (pozn. zavorky, carky apod.) .. tedy zakladni znaky lze predpokladat jako signed, ale vse ostatni je implementation-defined. Dulezite je, ze to chovani je arch dependent, treba x86 GNU/Linux je signed, ale ARM je unsigned apod. Viz: http://www.network-theory.co.uk/docs/gccintro/gccintro_71.html Takze je vhodne bud kompilovat s -fsigned-char pokud trvate na tom, ze char ma nejake urcite znaminko. Jinak v kodu je vhodne pouzivat "char" jen tam kde se nepracuje se znaky, jinak striktne "unsigned char".
jsem si prostě místo toho testu v duchu dosadil isspace() a chybu tudíž neodhalilPozor, s
isspace() vznikne velice podobná chyba – není ho totiž dovoleno volat se záporným argumentem.
Vždycky jsem měl za to, že je na implementaci, jestli bude char totéž co signed char nebo unsigned char, a programátor by tudíž neměl předpokládat ani jedno.Přesně tak.
Vyriešené to bolo nakoniec cez regexp.
Ze ß to vyrobilo SS? Jako z jednoho znaku dva?Pokud ano, tak to jednalo zcela podle standardu: UniCode (alespoň ve verzi 5.0, do které zrovna koukám) ve svých case mappings opravdu definuje, že 00DF (German es-zed) má jako upper case 0053 0053 (SS). A stejně se, tuším, chová i německý pravopis.