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í
×
eParkomat, startup z ČR, postoupil mezi finalisty evropského akcelerátoru ChallengeUp!
Robot na pivo mu otevřel dveře k opravdovému byznysu
Internet věcí: Propojený svět? Už se to blíží...
dnes 16:24 | Nová verze

Byla vydána Mageia 5.1. Jedná se o první opravné vydání verze 5, jež vyšla v červnu loňského roku (zprávička). Uživatelům verze 5 nepřináší opravné vydání nic nového, samozřejmě pokud pravidelně aktualizují. Vydání obsahuje všechny aktualizace za posledního téměř půldruhého roku. Mageia 5.1 obsahuje LibreOffice 4.4.7, Linux 4.4.32, KDE4 4.14.5 nebo GNOME 3.14.3.

Ladislav Hagara | Komentářů: 0
dnes 13:42 | Pozvánky

V Praze probíhá konference Internet a Technologie 16.2, volné pokračování jarní konference sdružení CZ.NIC. Konferenci lze sledovat online na YouTube. K dispozici je také archiv předchozích konferencí.

Ladislav Hagara | Komentářů: 0
včera 22:44 | Komunita

Joinup informuje, že Mnichov používá open source groupware Kolab. V srpnu byl dokončen dvouletý přechod na toto řešení. V provozu je asi 60 000 poštovních schránek. Nejenom Kolabu se věnoval Georg Greve ve své přednášce Open Source: the future for the European institutions (SlideShare) na konferenci DIGITEC 2016, jež proběhla v úterý 29. listopadu v Bruselu. Videozáznam přednášek z hlavního sálu je ke zhlédnutí na Livestreamu.

Ladislav Hagara | Komentářů: 12
včera 15:30 | Zajímavý projekt

Společnost Jolla oznámila v příspěvku Case study: Sailfish Watch na svém blogu, že naportovala Sailfish OS na chytré hodinky. Využila a inspirovala se otevřeným operačním systémem pro chytré hodinky AsteroidOS. Použita je knihovna libhybris. Ukázka ovládání hodinek na YouTube.

Ladislav Hagara | Komentářů: 8
včera 14:15 | Nová verze

Byla vydána verze 7.1.0 skriptovacího jazyka PHP používaného zejména k vývoji dynamických webových stránek. Jedná se o první stabilní verzi nejnovější větvě 7.1. Přehled novinek v dokumentaci. Podrobnosti v ChangeLogu. K dispozici je také příručka pro přechod z PHP 7.0.x na PHP 7.1.x.

Ladislav Hagara | Komentářů: 2
včera 12:55 | Nová verze

Google Chrome 55 byl prohlášen za stabilní. Nejnovější stabilní verze 55.0.2883.75 tohoto webového prohlížeče přináší řadu oprav a vylepšení (YouTube). Opraveno bylo také 36 bezpečnostních chyb. Mariusz Mlynski si například vydělal 22 500 dolarů za 3 nahlášené chyby (Universal XSS in Blink).

Ladislav Hagara | Komentářů: 4
včera 11:55 | Pozvánky

Máte rádi svobodný software a hardware nebo se o nich chcete něco dozvědět? Přijďte na 135. sraz spolku OpenAlt, který se bude konat ve čtvrtek 8. prosince od 18:00 v Radegastovně Perón (Stroupežnického 20, Praha 5). Sraz bude tentokrát tématický. Bude retro! K vidění budou přístroje jako Psion 5mx nebo Palm Z22. Ze svobodného hardwaru pak Openmoko nebo čtečka WikiReader. Přijďte se i vy pochlubit svými legendami, nebo alespoň na pivo. Moderní hardware má vstup samozřejmě také povolen.

xkucf03 | Komentářů: 0
včera 00:10 | Nová verze

Byla vydána verze 3.2 svobodného systému pro detekci a prevenci průniků a monitorování bezpečnosti počítačových sítí Suricata. Z novinek lze zmínit například podporu protokolů DNP3 a CIP/ENIP, vylepšenou podporu TLS a samozřejmě také aktualizovanou dokumentaci.

Ladislav Hagara | Komentářů: 0
1.12. 21:00 | Nová verze

Byla vydána beta verze Linux Mintu 18.1 s kódovým jménem Serena. Na blogu Linux Mintu jsou hned dvě oznámení. První o vydání Linux Mintu s prostředím MATE a druhé o vydání Linux Mintu s prostředím Cinnamon. Stejným způsobem jsou rozděleny také poznámky k vydání (MATE, Cinnamon) a přehled novinek s náhledy (MATE, Cinnamon). Linux Mint 18.1 bude podporován až do roku 2021.

Ladislav Hagara | Komentářů: 0
1.12. 16:42 | Nová verze

Byl vydán Devuan Jessie 1.0 Beta 2. Jedná se o druhou beta verzi forku Debianu bez systemd představeného v listopadu 2014 (zprávička). První beta verze byla vydána v dubnu letošního roku (zprávička). Jedna z posledních přednášek věnovaných Devuanu proběhla v listopadu na konferenci FSCONS 2016 (YouTube, pdf).

Ladislav Hagara | Komentářů: 0
Kolik máte dat ve svém domovském adresáři na svém primárním osobním počítači?
 (32%)
 (24%)
 (29%)
 (7%)
 (5%)
 (3%)
Celkem 764 hlasů
 Komentářů: 50, poslední 29.11. 15:50
Rozcestník
Reklama

Dotaz: C ukazatel přetečení zásobníku

4.1.2014 23:05 kammtar
C ukazatel přetečení zásobníku
Přečteno: 534×
Zdravím, Narazil jsme na jednu věc a docela by mě zajímalo proč.

char *buff; getcwd(buff,100);

Vyzkoušel jsem tento kód funguje správně ale v momentě kdy se snažím do programu přidat byť i jenom jeden int tak to skončí na SIGSEV.

Vím že za použití malloc je problém vyřešen ale mě zajímá proč. Aji když si getcwd alokuje něco kolem 100*sizeof(char) tak to nemůže zaplnit celý zásobník ne? Dále v programu už používám jenom opendir() který mi snad nehází ty data na zásobník.

Odpovědi

4.1.2014 23:18 Šangala | skóre: 56 | blog: Dutá Vrba - Wally
Rozbalit Rozbalit vše Re: C ukazatel přetečení zásobníku
char *buff je jen neinicializovaný (ukazující kdokoliv ví kam), nealokuje žádnou paměť.

To, že trpíš stihomamem, ještě neznamená, že po tobě nejdou. ⰞⰏⰉⰓⰀⰜⰉ ⰗⰞⰅⰜⰘ ⰈⰅⰏⰉ ⰒⰑⰎⰉⰁⰕⰅ ⰏⰉ ⰒⰓⰄⰅⰎ ·:⁖⁘⁙†
4.1.2014 23:19 Šangala | skóre: 56 | blog: Dutá Vrba - Wally
Rozbalit Rozbalit vše Re: C ukazatel přetečení zásobníku
Oprava:
char *buff je jen neinicializovaný ukazatel/pointer (ukazující kdokoliv ví kam), nealokuješ žádnou paměť.
To, že trpíš stihomamem, ještě neznamená, že po tobě nejdou. ⰞⰏⰉⰓⰀⰜⰉ ⰗⰞⰅⰜⰘ ⰈⰅⰏⰉ ⰒⰑⰎⰉⰁⰕⰅ ⰏⰉ ⰒⰓⰄⰅⰎ ·:⁖⁘⁙†
4.1.2014 23:25 kammtar
Rozbalit Rozbalit vše Re: C ukazatel přetečení zásobníku
To je mi jasné, ale proč to pokaždé funguje? Podle manuálu getcwd() si alokuje paměť když je pointer na buffer null což není.
4.1.2014 23:29 Šangala | skóre: 56 | blog: Dutá Vrba - Wally
Rozbalit Rozbalit vše Re: C ukazatel přetečení zásobníku
C-čko tě nekontroluje co děláš, nikdo nic nealokuje, prostě to píše na tu velmi-velmi-pseudo náhodnou adresu kam to ukazuje.
Nedal;s NULL, a řekl's že na té adrese je 100 char-ů alokovaných, tak se to tam zapíše.
To, že trpíš stihomamem, ještě neznamená, že po tobě nejdou. ⰞⰏⰉⰓⰀⰜⰉ ⰗⰞⰅⰜⰘ ⰈⰅⰏⰉ ⰒⰑⰎⰉⰁⰕⰅ ⰏⰉ ⰒⰓⰄⰅⰎ ·:⁖⁘⁙†
martin-ux avatar 5.1.2014 00:11 martin-ux | skóre: 18 | Bratislava
Rozbalit Rozbalit vše Re: C ukazatel přetečení zásobníku
nie je tak pravda .. getcwd ho alokuje, ked je NULL. az teraz som pochopil, co sa OP pyta.

takto je to ok:
int main() {
	char* buf = NULL;
	buf = getcwd(buf, 100);

	printf ("buf: %s\n", buf);

	free(buf);
	buf = NULL;

	return 0;
}
buf musi byt NULL aby sa alokoval novy space. ak je not NULL, tak getcwd() to bere ako pointer na alokovany space.

src: FreeBSD: /usr/src/lib/libc/gen/getcwd.c:

    90		} else {
    91			if ((pt = malloc(ptsize = PATH_MAX)) == NULL)
    92				return (NULL);
    93			ept = pt + ptsize;
kde pt je prvy arg. fcie.
..when you do things right, people won't be sure you've done anything at all..
5.1.2014 16:20 Šangala | skóre: 56 | blog: Dutá Vrba - Wally
Rozbalit Rozbalit vše Re: C ukazatel přetečení zásobníku
Ano, tak to je. A co není pravda?
To, že trpíš stihomamem, ještě neznamená, že po tobě nejdou. ⰞⰏⰉⰓⰀⰜⰉ ⰗⰞⰅⰜⰘ ⰈⰅⰏⰉ ⰒⰑⰎⰉⰁⰕⰅ ⰏⰉ ⰒⰓⰄⰅⰎ ·:⁖⁘⁙†
martin-ux avatar 5.1.2014 16:51 martin-ux | skóre: 18 | Bratislava
Rozbalit Rozbalit vše Re: C ukazatel přetečení zásobníku
nedaju sa editovat prispevky, chcel som napisat "nie je to tak celkom pravda". tym som chcel reagovat na:
nikdo nic nealokuje
ze v tomto pripade getcwd() alokuje za neho buffer, ak je vstupny argument pre buf NULL.
..when you do things right, people won't be sure you've done anything at all..
5.1.2014 17:09 Šangala | skóre: 56 | blog: Dutá Vrba - Wally
Rozbalit Rozbalit vše Re: C ukazatel přetečení zásobníku
Ju, už mi to pomalu došlo, to je jen nedorozumění.
»nikdo nic nealokuje« jsem myslel v tom původním případě, tedy tehdy pokud není ukazatel inicializovaný (na NULL nebo na alokovanou paměť).
To, že trpíš stihomamem, ještě neznamená, že po tobě nejdou. ⰞⰏⰉⰓⰀⰜⰉ ⰗⰞⰅⰜⰘ ⰈⰅⰏⰉ ⰒⰑⰎⰉⰁⰕⰅ ⰏⰉ ⰒⰓⰄⰅⰎ ·:⁖⁘⁙†
martin-ux avatar 5.1.2014 19:31 martin-ux | skóre: 18 | Bratislava
Rozbalit Rozbalit vše Re: C ukazatel přetečení zásobníku
jj, sme sa nerozumeli :).
..when you do things right, people won't be sure you've done anything at all..
4.1.2014 23:30 majkl
Rozbalit Rozbalit vše Re: C ukazatel přetečení zásobníku
protoze nahoda? pustit to treba jindy/jinde, zas to pokazdy zhavaruje
martin-ux avatar 4.1.2014 23:55 martin-ux | skóre: 18 | Bratislava
Rozbalit Rozbalit vše Re: C ukazatel přetečení zásobníku
velmi vela, hodne dobrych FAQs na jednom mieste aj s vysvetlenim tu, tvoj problem tu
..when you do things right, people won't be sure you've done anything at all..
5.1.2014 10:57 potato
Rozbalit Rozbalit vše Re: C ukazatel přetečení zásobníku
Kód nefunguje správně. S tvou verzí kompilátoru, architekturou, volbami při kompilaci, ..., etc. se náhodou předá getcwd() vhodný první argument.

Proměnné na zásobníku jsou neinicializovaná. Když je neinicializovaný buff náhodou NULL, tak getcwd() alokuje paměť. To je ten případ, kdy si myslíš, že to funguje.

Když něco přidáš, tak to dopadne tak (opět náhodou), že neinicializovaný buff už není NULL -- a getcwd() tedy dostane ukazatel někam doprčic a program spadne.
5.1.2014 19:11 Program
Rozbalit Rozbalit vše Re: C ukazatel přetečení zásobníku
Ač trochu nesrozumitelně, ale už byla asi většina věcí vysvětlená. Jen bych trochu upřesnil, že ačkoli getpwd při NULL pointeru inteligentně alokuje pamět, nealokuje ji na zásobníku, ale na haldě, takže se vždy musí uvolnit pomocí free, jinak vzniká tzv. memory leak. Nastudujte si, jak to funguje, jinak nic v C nenaprogramujete (všechno bude dřív nebo později padat)
14.1.2014 17:16 Nikola Pajkovský | skóre: 16
Rozbalit Rozbalit vše Re: C ukazatel přetečení zásobníku

As an extension to the POSIX.1-2001 standard, Linux (libc4, libc5, glibc) getcwd() allocates the buffer dynamically using malloc(3) if buf is NULL. In this case, the allocated buffer has the length size unless size is zero, when buf is allocated as big as necessary. The caller should free(3) the returned buffer.

#include <linux/limits.h>

/* ... includes ...*/

char *buf = NULL;
buf = getcwd(buf, PATH_MAX);
nebo
#include <linux/limits.h>

/* ... includes ...*/

char buf[PATH_MAX];
buf = getwd(buf, sizeof(buf));
Save the whales. Feed the hungry. Free the mallocs

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.