Ruská firma Operation Zero nabízí až $4 miliony za funkčí exploit komunikační platformy Telegram. Nabídku učinila na platformě X. Firma je známá prodejem exploitů ruské vládě a soukromým společnostem. Další informace na securityweek.com.
Po 9 týdnech vývoje od vydání Linuxu 6.13 oznámil Linus Torvalds vydání Linuxu 6.14. Proč až v pondělí? V neděli prostě zapomněl :-). Přehled novinek a vylepšení na LWN.net: první a druhá polovina začleňovacího okna a Linux Kernel Newbies.
Konference LinuxDays 2025 proběhne o víkendu 4. a 5. října v Praze v areálu ČVUT v Dejvicích na FIT.
Mapy.cz rostou a postupně přechází na Mapy.com. V plánu je vylepšení Map novými zahraničními uživateli.
Byl představen Raspberry Pi PoE+ Injector pro napájení Raspberry Pi po datovém síťovém kabelu (PoE). Cena je 25 dolarů.
Jakub Vrána napsal AI plugin sql-gemini pro nástroj pro správu databáze v jednom PHP souboru Adminer. Plugin dovoluje sestavovat SQL dotazy pomocí AI, konkrétně pomocí Google Gemini.
Na čem aktuálně pracují vývojáři GNOME a KDE Plasma? Pravidelný přehled novinek v Týden v GNOME a Týden v KDE Plasma.
Byla vydána nová verze 0.4.15 (𝕏) svobodného operačního systému ReactOS (Wikipedie), jehož cílem je kompletní binární kompatibilita s aplikacemi a ovladači pro Windows. Přehled novinek i s náhledy v oznámení o vydání.
Byl představen rpi-image-gen, tj. oficiální nástroj pro vytváření vlastních softwarových obrazů pro zařízení Raspberry Pi.
Byla vydána nová major verze 8.0, aktuálně 8.0.1, softwaru pro správu elektronických knih Calibre (Wikipedie). Přehled novinek v poznámkách k vydání. Vypíchnuta je lepší podpora Kobo KEPUB formátu nebo integrovaný lokálně běžící engine Piper pro převod textu na řeč používaný pro čtení nahlas (již od verze 7.18).
Zdravim, mam problem s jednim kodem. Po urcite dobe behu mi padne na hubu.Nevim uz jak tuto chybu osetrit. Nejsem uplne C guru... Prikladam zdrojak fce ve ktere to asi pada:
float DejTeplotu(char* OW) { unsigned err; char * buf; size_t s ; char* cesta; char* prac; if (OW == NULL) {cout << "Nulovy OW!!!"; return 0; } else { //if (OW == NULL) {cout << "Nulovy OW!!!"; return 0; break; } //cout << "Delka:" << strlen(OW); cesta = (char *) malloc(strlen("//10.99A689020800/temperaturenase")); prac = (char *) malloc(strlen(OW)); if ((cesta != NULL) && (prac !=NULL)) { cesta[0] = 0; prac = strcpy(prac,OW); cesta = strcpy(cesta,"/"); // cout << cesta; unsigned i; for (i = 0; i < strlen(prac); i++) { // cout << prac[i] << endl; cesta[i+1] = prac[i]; } cesta[i+1] = 0; strcat(cesta,"/temperature"); // cout << endl << "Vysledek:" << cesta << endl; err = OW_init("/dev/i2c-1"); if (err >= 0) { OW_set_error_print("2"); OW_set_error_level("6"); OW_get(cesta,&buf,&s) ; // OW_get("/10.99A689020800/temperature",&buf,&s) ; return stof(buf); free(buf); free(prac); free(cesta); OW_finish() ; } else { cout << "Vyskytla se chyba v inicializaci-asi malo pameti" << endl; return 0; } } else { free(cesta); free(prac); cout << "Vyskytla se chyba v inicializaci" << endl; return 0; } } }A jeste vypis z gdb:
Program received signal SIGSEGV, Segmentation fault. 0xb6a7e834 in strlen () from /lib/arm-linux-gnueabihf/libc.so.6 (gdb) bt #0 0xb6a7e834 in strlen () from /lib/arm-linux-gnueabihf/libc.so.6 #1 0xb6c77934 in std::basic_string:char, std::char_traits"char", std::allocator"char" >::basic_string(char const*, std::allocator"char" const&) () from /usr/lib/arm-linux-gnueabihf/libstdc++.so.6 #2 0x00009550 in DejTeplotu (OW=0x32419 "1099A68902080000") at ./main.cpp:75 #3 0x00009fd0 in main () at ./main.cpp:298 (gdb)
Jsem v koncich...Kdyby nekdo mohl probehnout tento kod a nakopl mne... Dekuji
Řešení dotazu:
gdb
toho moc nevidím. Že by chybějící volba -g
při kompilaci?
Na první pohled mi přijde, že počítáš s tím, že strlen()
vrací velikost řetězce v paměti. Ve skutečnosti ale vrací délku řetězce. V paměti céčkovský řetězec ještě přidává znak 0x00, potřebuje tedy jeden bajt navíc.
Navíc je to taková sprasená ukázka kódu, že nevím, co si jen zkoušíš a co má nějaký reálný význam. Občas je dobré pro účely porady minimalizovat zdroják na co nejmenší kus, kde se problém ještě projevuje.
cpp
a jsou použity stream-y
, tak není důvod proč nepoužít std::string
a je (s tímto) pokoj.
Řádek 75 je
return stof(buf);
přičemž stof()
na argument volá konstruktor std::stringstream
, který nejdřív implicitně zavolá konstruktor std::string
. Můj tip je, že OW_get()
vrátila NULL nebo nějaký nesmyslný pointer. Protože nevím, co ta funkce dělá, nemůžu si být jistý, jestli smí vrátit NULL a jestli jste to měl ošetřit (spíš ano).
// tady bys mel mit
prac = (char *) malloc(strlen(OW) + 1);
// misto
prac = (char *) malloc(strlen(OW));
if ((cesta != NULL) && (prac !=NULL))
{
cesta[0] = 0;
// jinak je tohle blbost, jak pise kolega vyse v poznamce!!!
// protoze neni kam ulozit ukoncovaci 0x0
prac = strcpy(prac,OW);
return
okamžitě vyskočí z prováděné funkce, takže příkazy za returnem
se již neprovedou. Tvůj způsob použití return
dává tušit, že máš úplně jinou představu o jeho fungování. Funkce malloc
vrátí NULL
, pokud nemůže tvůj požadavek na alokaci paměti uspokojit a patrně právě na tom potom ten proces upadne, když se snažíš do NULL
pointeru zkopírovat jiný řetězec.
OW_get()
, jak jsem vám radil?
float DejTeplotu(string OW) { float vystup; vystup = 0; //cout << "OW:"<< OW << "delka:" << OW.length() << endl; if (OW.length() == 16) { char * buf; size_t s ; string cesta = "/"; cesta += OW; cesta += "/temperature"; if (OW_init("/dev/i2c-1") >= 0) { OW_set_error_print("2"); OW_set_error_level("6"); // OW_get("/10.99A689020800/temperature",&buf,&s) ; if (OW_get(cesta.c_str(),&buf,&s) >=0) { vystup = stof(buf); free(buf); OW_finish() ; } else { cout << "Chyba pri ziskavani teploty z cidla: " << OW << endl; } }else { cout << "Chyba pri inicializaci sbernice!" << endl; } }else { cout << "Neplatny nazev cidla!" << endl; } return vystup; }
Pominu-li coding style, který se mi moc nelíbí a navíc ani není konzistentní, měl bych výhrady hlavně ke zpracování chyb. Dojde-li k chybě, měla by funkce buď vyhodit výjimku (když už používáte C++, proč nevyužít jeho výhod?) nebo chybu signalizovat volajícímu (typicky návratovou hodnotou). Varianta, kdy funkce natvrdo vypíše chybu na chybový výstup a pak vrátí jakousi nahodilou hodnotu, kterou by dost možná mohla vrátit i pokud je všechno v pořádku, je velmi nešťastný. Jak má volající poznat, jestli dostal smysluplnou hodnotu nebo jestli došlo k chybě?
Výjimky. Je to přehledné, pohodlné a můžete si snadno zvolit, kde se bude na chybu reagovat a jaké informace je tam potřeba předat. Samozřejmě za to platíte určitým overheadem, který ale u tohoto typu aplikace nebude nijak tragický.
Jinak samozřejmě můžete použít léty prověřenou klasiku: teplota se bude ukládat do bufferu, na který dostanete pointer (v C++ můžete použít referenci) a funkce bude vracet jako návratovou hodnotu kód chyby (nebo aspoň bool OK/chyba).
for (i = 0; i < strlen(prac); i++)
{
//cout << prac[i] << endl;
cesta[i+1] = prac[i];
}
cesta[i+1] = 0;
Tiskni
Sdílej: