abclinuxu.cz AbcLinuxu.cz itbiz.cz ITBiz.cz HDmag.cz HDmag.cz abcprace.cz AbcPráce.cz
AbcLinuxu hledá autory!
Inzerujte na AbcPráce.cz od 950 Kč
Rozšířené hledání
×
    včera 17:11 | Zajímavý článek

    Stanislav Fort, vedoucí vědecký pracovník z Vlčkovy 'kyberbezpečnostní' firmy AISLE, zkoumal dopady Anthropic Mythos (nový AI model od Anthropicu zaměřený na hledání chyb, který před nedávnem vyplašil celý svět) a předvedl, že schopnosti umělé inteligence nejsou lineárně závislé na velikosti nebo ceně modelu a dokázal, že i některé otevřené modely zvládly v řadě testů odhalit ve zdrojových kódech stejné chyby jako Mythos (například FreeBSD CVE-2026-4747) a to s výrazně nižšími provozními náklady.

    MakeIranBombedAgain❗ | Komentářů: 5
    včera 12:44 | IT novinky

    Federální návrh zákona H.R.8250 'Parents Decide Act', 13. dubna předložený demokratem Joshem Gottheimerem a podpořený republikánkou Elise Stefanik coby spolupředkladatelkou (cosponsor), by v případě svého schválení nařizoval všem výrobcům operačních systémů při nastavování zařízení ověřovat věk uživatelů a při používání poskytovat tento věkový údaj aplikacím třetích stran. Hlavní rozdíl oproti kalifornskému zákonu AB 1043 a kolorádskému SB26-051 je ten, že federální návrh by platil rovnou pro celé USA.

    MakeIranBombedAgain❗ | Komentářů: 12
    včera 12:33 | Nová verze

    Qwen (čínská firma Alibaba Cloud) představila novou verzi svého modelu, Qwen3.6‑35B‑A3B. Jedná se o multimodální MoE model s 35 miliardami parametrů (3B aktivních), nativní kontextovou délkou až 262 144 tokenů, 'silným multimodálním vnímáním a schopností uvažování' a 'výjimečnou schopností agentického kódování, která se může měřit s mnohem rozsáhlejšími modely'. Model a dokumentace jsou volně dostupné na Hugging Face, případně na čínském Modelscope. Návod na spuštění je už i na Unsloth.

    MakeIranBombedAgain❗ | Komentářů: 1
    včera 11:00 | Nová verze

    Sniffnet, tj. multiplatformní (Windows, macOS a Linux) open source grafická aplikace pro sledování internetového provozu, byl vydán ve verzi 1.5. V přehledu novinek je vypíchnuta identifikace aplikací komunikujících po síti.

    Ladislav Hagara | Komentářů: 4
    včera 02:22 | Nová verze

    V programovacím jazyce Go naprogramovaná webová aplikace pro spolupráci na zdrojových kódech pomocí gitu Forgejo byla vydána ve verzi 15.0 (Mastodon). Forgejo je fork Gitei.

    Ladislav Hagara | Komentářů: 1
    včera 01:11 | Pozvánky

    Současně se SUSECON 2026 proběhne příští čtvrtek v Praze také komunitní Open Developer Summit (ODS) zaměřený na open source a openSUSE. Akce se koná ve čtvrtek 23. 4. (poslední den SUSECONu) v Hilton Prague (místnost Berlin 3) a je zcela zdarma, bez nutnosti registrace na SUSECON. Na programu jsou témata jako automatizace (AutoYaST), DevOps, AI v terminálu, bezpečnost, RISC-V nebo image-based systémy. Všichni jste srdečně zváni.

    lkocman | Komentářů: 1
    16.4. 15:44 | Humor

    Český úřad zeměměřický a katastrální zavedl u anonymního nahlížení do katastru nemovitostí novou CAPTCHA ve formě mapové puzzle: nepřihlášení uživatelé musí nově správně otočit devět dlaždic v 3x3 poli tak, aby dohromady daly souvislý obrázek výseče reálné mapy, přičemž na to mají pouze jeden časově omezený pokus. Test je podle uživatelů i odborníků příliš obtížný a na sociálních sítích pochopitelně schytává zaslouženou kritiku a

    … více »
    MakeIranBombedAgain❗ | Komentářů: 34
    16.4. 15:33 | Nová verze

    Byla vydána verze 1.95.0 programovacího jazyka Rust (Wikipedie). Podrobnosti v poznámkách k vydání. Vyzkoušet Rust lze například na stránce Rust by Example.

    Ladislav Hagara | Komentářů: 0
    16.4. 15:22 | Zajímavý software

    Mozilla prostřednictvím své dceřiné společnosti MZLA Technologies Corporation představila open-source AI klienta Thunderbolt. Primárně je určený pro firemní nasazení.

    Ladislav Hagara | Komentářů: 0
    16.4. 14:00 | IT novinky

    Firma Cal.com oznámila, že přesouvá svůj produkční kód z otevřeného do uzavřeného repozitáře z důvodu bezpečnostního rizika umělé inteligence, která prý dokáže vyhledávat a zneužívat zranitelnosti rychleji, než by je jejich vývojářský tým stíhal opravovat. Zároveň zveřejnila samostatnou, open-source verzi Cal.diy pod licencí MIT, ovšem bez řady původních funkcí. O tom, zda je toto opatření rozumné, existují pochyby. … více »

    MakeIranBombedAgain❗ | Komentářů: 6
    Které desktopové prostředí na Linuxu používáte?
     (14%)
     (8%)
     (1%)
     (12%)
     (30%)
     (3%)
     (6%)
     (2%)
     (15%)
     (25%)
    Celkem 1353 hlasů
     Komentářů: 30, poslední 3.4. 20:20
    Rozcestník

    Dotaz: SIGSEGV v C++ linux

    4.4.2013 01:53 Filip
    SIGSEGV v C++ linux
    Přečteno: 618×

    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:


    Odpovědi

    pavlix avatar 4.4.2013 02:13 pavlix | skóre: 54 | blog: pavlix
    Rozbalit Rozbalit vše Re: SIGSEGV v C++ linux
    Ve výpisu v 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.
    Já už tu vlastně ani nejsem. Abclinuxu umřelo.
    4.4.2013 02:26 Filip
    Rozbalit Rozbalit vše Re: SIGSEGV v C++ linux
    Příloha:
    Muj problem je ze upne presne nevim kde program pada...Smycka bezi treba hodinu bez padu a pak najednou SIG... :( Program kompiluju v g++ s parametrem -gdb2 s -g to muzu zkusit...

    strlen vim ze dava delku.

    V priloze je zdrojak cely...

    Fakt jsem z toho zoufalej...Mam tam vystup z databaze, kde je nazev cidla OW, potrebuju z toho udelat realnou cestu a zjistit teplotu z daneho cidla. Nejsem si jistej jestli mi mysql neda nejakou blost ale v backtrace je nazev cidla dobre. Myslel jsem i na to ze zapisuju nekam do null pointeru ale zda se take ze ne tak nevim... :(

    jinak diky za rychlou odpoved :)

    4.4.2013 08:24 jekub
    Rozbalit Rozbalit vše Re: SIGSEGV v C++ linux
    strlen vim ze dava delku

    ale bez ukoncovaci \0. strcpy pak potrebuje minimalne strlen+1
    4.4.2013 08:36 Šangala | skóre: 56 | blog: Dutá Vrba - Wally
    Rozbalit Rozbalit vše Re: SIGSEGV v C++ linux
    Je hezké, že to víte, ale z kódu není jasné, jestli ta alokované délka - 1 nemůže být překročena, nikde to otestované není. Když už je to cpp a jsou použity stream-y, tak není důvod proč nepoužít std::string a je (s tímto) pokoj.
    To, že trpíš stihomamem, ještě neznamená, že po tobě nejdou. ⰞⰏⰉⰓⰀⰜⰉ ⰗⰞⰅⰜⰘ ⰈⰅⰏⰉ ⰒⰑⰎⰉⰁⰕⰅ ⰏⰉ ⰒⰓⰄⰅⰎ ·:⁖⁘⁙†
    4.4.2013 09:12 Michal Kubeček | skóre: 71 | Luštěnice
    Rozbalit Rozbalit vše Re: SIGSEGV v C++ linux

    Řá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).

    4.4.2013 09:06 sofffos
    Rozbalit Rozbalit vše Re: SIGSEGV v C++ linux
    Ja moc nerobim v c, len v c++ a tam pouzivam len string char* sa vyhybam ako mozem, ale skusal som strlen a vyslo mi ze problem je pravdepodobne v tom ze ten char* nieje inicializovany na NULL. Potom ti ta kontrola na NULL nepomoze. Cize problem je asi v tom OW. Skusil som len vytvorit char* a otestovat na NULL a padlo to musel som do char* priradit NULL az potom to fungovalo. Neviem ci je problem v tvojom kode alebo vo funkcii ktora ti vracia ten char* pretoze nemas kod v ktorom by som videl ako pouzivas to DejTeplotu. Skusal som ako to inak otestovat ci je initializovany char ale nic som nenasiel. Jedine co som nasiel je inicializovat char* na NULL hned po vytvoreni.
    4.4.2013 09:58 StenFil
    Rozbalit Rozbalit vše Re: SIGSEGV v C++ linux
    // 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);


    4.4.2013 10:03 StenFil
    Rozbalit Rozbalit vše Re: SIGSEGV v C++ linux
    A to ze nejsi GURU, je fakt jasne. Doufam ze se jedna o nejaky skolni priklad a ze nic podobneho nebezi nekde v realnem provozu. Au.
    4.4.2013 10:29 Filip
    Rozbalit Rozbalit vše Re: SIGSEGV v C++ linux
    V reálném provozu to neběží... :) Pokud by to mělo někde být nasazeno muselo by to projít velkou evolucí :)

    Spoustu poznatků :) otestuji...

    Jinak string nemohu použít parametry fcí OW jsou char*.

    Dokumentace:

    OWFS capi

    Jdu testovat...

    Řešení 1× (Filip (tazatel))
    4.4.2013 10:58 Šangala | skóre: 56 | blog: Dutá Vrba - Wally
    Rozbalit Rozbalit vše Re: SIGSEGV v C++ linux
    Můžeš a měl bys… :)
    c_str()
    To, že trpíš stihomamem, ještě neznamená, že po tobě nejdou. ⰞⰏⰉⰓⰀⰜⰉ ⰗⰞⰅⰜⰘ ⰈⰅⰏⰉ ⰒⰑⰎⰉⰁⰕⰅ ⰏⰉ ⰒⰓⰄⰅⰎ ·:⁖⁘⁙†
    4.4.2013 11:04 Filip
    Rozbalit Rozbalit vše Re: SIGSEGV v C++ linux
    c_str je přesně to co mi strejda google neřekl :) celé to přadělám...Zamotal jsem se do toho strašně... ošetřím všechny chyby těch funkcí. Teď jsem se hrabal v dokumentacích a je tam spoustu err parametrů, které musím ošetřit :)

    pavlix avatar 4.4.2013 22:51 pavlix | skóre: 54 | blog: pavlix
    Rozbalit Rozbalit vše Re: SIGSEGV v C++ linux
    +1
    Já už tu vlastně ani nejsem. Abclinuxu umřelo.
    clayman avatar 8.4.2013 19:17 clayman | skóre: 13 | Praha 6
    Rozbalit Rozbalit vše Re: SIGSEGV v C++ linux
    Pakliže by funkce brala jen char*, musel by ještě použít const_cast.
    4.4.2013 11:00 Filip
    Rozbalit Rozbalit vše Re: SIGSEGV v C++ linux
    Tak malloc(strlen(OW) + 1) nepomohlo...

    Budu muset projít všechny fce a jejich chybové výstupy když se něco nepovede.

    A hlavně ten zdroják vyčistit... :)

    Pozitivní ale je, že to padá pořád na stejném místě...Hlavně je mi strašně podezdřelé, že čas po kterou to běží je pořád stejný... CCA 30 minut... Jestli náhodou to nebude chyba jinde.. Třeba v neuvolněná paměť někde? A postupem času to padne...Jinak běží to na Raspberry takže paměti tam není mnoho :)

    Mno nic jdu se s tím poprat...

    Michy avatar 4.4.2013 11:40 Michy | skóre: 11 | Praha
    Rozbalit Rozbalit vše Re: SIGSEGV v C++ linux
    Že neuvolňuješ paměť po alokaci, je více než jisté. Uvědom si, že příkaz 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.
    Michy avatar 4.4.2013 11:45 Michy | skóre: 11 | Praha
    Rozbalit Rozbalit vše Re: SIGSEGV v C++ linux
    Pardon, tak test na NULL tam máš, ale free se opravdu nevolá.
    4.4.2013 12:38 Michal Kubeček | skóre: 71 | Luštěnice
    Rozbalit Rozbalit vše Re: SIGSEGV v C++ linux
    Zkontroloval jste si tu návratovou hodnotu OW_get(), jak jsem vám radil?
    5.4.2013 13:52 Filip
    Rozbalit Rozbalit vše Re: SIGSEGV v C++ linux
    Cele jsem to pretvoril vypada to zatim dobre.Viz nasledujici kod:
    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;
    }
    5.4.2013 14:28 Michal Kubeček | skóre: 71 | Luštěnice
    Rozbalit Rozbalit vše Re: SIGSEGV v C++ linux

    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ě?

    5.4.2013 14:33 Filip
    Rozbalit Rozbalit vše Re: SIGSEGV v C++ linux
    I na to jsem uz myslel...Zatim to mam spusteno jen v testovacim cyklu. Chtel bych to samozrejme udelat ale zatim nevim jak to napsat :) je na to c++ nejaka osvedcena konstrukce? Děkuji ...
    5.4.2013 14:43 Michal Kubeček | skóre: 71 | Luštěnice
    Rozbalit Rozbalit vše Re: SIGSEGV v C++ linux

    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).

    5.4.2013 16:27 mankind_boost
    Rozbalit Rozbalit vše Vysvětlení
    Tak píšeš v C nebo v C++? Tohle je nějakej podivnej hybrid, docela bych se divil, kdyby to fungovalo správně.
    5.4.2013 16:32 mankind_boost
    Rozbalit Rozbalit vše Re: Vysvětlení
    for (i = 0; i < strlen(prac); i++)
    {
    //cout << prac[i] << endl;
    cesta[i+1] = prac[i];
    }
    cesta[i+1] = 0;

    tohle je nějaký divný. Taky vracíš 0, to je ale integer, mělo by to bejt 0.0f. Zkus kompilovat s parametrem -Wall a -pedantic.
    5.4.2013 20:39 Filip
    Rozbalit Rozbalit vše Re: Vysvětlení
    Cely puvodni kod jsem predelal. Chyba nakonec byla v implementaci ow_init, kde docahzelo k neplatne inicializaci a bez osetreni to padlo... Ted jiz vse beha jak ma :) Mám v C++ ještě co dohánět musím to víc nastudovat...Nepsal jsem v tom už hodně dlouho...V poslední době dělám hlavně PLC a C a C++ bylo pro mne dobrých 10 let tabu...

    Jinak všem děkuji za pomoc...
    6.4.2013 21:26 Jardík
    Rozbalit Rozbalit vše Re: SIGSEGV v C++ linux
    Jenom si nemůžu odpustit připomínku: operátor sizeof vrací hodnotu typu std::size_t, nikoliv unsigned int.

    Založit nové vláknoNahoru

    Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

    ISSN 1214-1267   www.czech-server.cz
    © 1999-2015 Nitemedia s. r. o. Všechna práva vyhrazena.