Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

Zasto ovo radi?!

[es] :: C/C++ programiranje :: Zasto ovo radi?!

[ Pregleda: 2848 | Odgovora: 8 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

Goran Arandjelovic
Beograd

Član broj: 29116
Poruke: 387
*.6.EUnet.yu.



+9 Profil

icon Zasto ovo radi?!04.09.2005. u 10:33 - pre 197 meseci
Mislim da ovo ne bi smelo da radi...sta se ovde desava? Da li je ovo ovako samo sa prostim tipovima?

Code:

int *x,i;
x = new int[1];
for(i=0;i<1000;i++){
  x[i] = 7;
}
cout << x[999];


Imam gcc3.3.4 ...
 
Odgovor na temu

X Files
Vladimir Stefanovic
Pozarevac

SuperModerator
Član broj: 15100
Poruke: 4890
*.nat-pool.po.sbb.co.yu.

Jabber: xfiles@elitesecurity.org


+633 Profil

icon Re: Zasto ovo radi?!04.09.2005. u 11:17 - pre 197 meseci
Dakle, u primeru koji si naveo treba da stoji:

Code:

x = new int[1000];


i na kraju:

Code:

delete [] x;


... da bi primer bio ispravan.

Pretpostavljam da ti je cudno to sto si rezervisao memoriju za samo 1 int, a
uspesno si pristupio memoriji i dodelio vrednosti za svih 1000, i na kraju sve to
verifikovao ispisom...

To je u C/C++ legalno (obican pointerski pristup), ali naravno nije dobro, jer kod
ozbiljnijih primera lako mozes da *unistis* (overwrite ili over-run) neki drugi objekat.

To je ono protiv cega se pored ostalog bori .NET i 'managed' kod.

U praksi to znaci da tvoj kod u startu moze i da proradi, a da u nekoj kasnijoj fazi
pukne i da pojma nmas zasto se to desilo...

U medjuvremenu pogledaj ovaj primer i probaj da predbidis rezultat:

Code:

   int *x,*y, i;
   x = new int[1];
   y = new int[1];

   y[0] = 8;

   for(i=0;i<1000;i++){
     x[i] = 7;
   }
  ShowMessage( x[999] );
  ShowMessage( y[0] );

  delete [] x;
  delete [] y;


... a posle probaj da zamaskiras petlju.


P.S. Dodatak:

Mene je slicna stvar dugo 'mucila' jer jedan od mojih NT servisa nikako nije hteo da
radi (stabilno) na NT4 Workstation, a radilo se (karikirano) o ovome:

char a[1000]
a[1000] = 'x';

... servis se non-stop po automatizmu zaustavljao kad doje do ovoga.



[Ovu poruku je menjao X Files dana 04.09.2005. u 12:21 GMT+1]

[Ovu poruku je menjao X Files dana 04.09.2005. u 12:28 GMT+1]
 
Odgovor na temu

Goran Arandjelovic
Beograd

Član broj: 29116
Poruke: 387
*.151.eunet.yu.



+9 Profil

icon Re: Zasto ovo radi?!04.09.2005. u 12:51 - pre 197 meseci
Bez provere pretpostavljam da ce i y[0] postati 7... Ispravi me ako gresim...
 
Odgovor na temu

X Files
Vladimir Stefanovic
Pozarevac

SuperModerator
Član broj: 15100
Poruke: 4890
*.nat-pool.po.sbb.co.yu.

Jabber: xfiles@elitesecurity.org


+633 Profil

icon Re: Zasto ovo radi?!04.09.2005. u 12:52 - pre 197 meseci
Da ! :)
 
Odgovor na temu

Goran Arandjelovic
Beograd

Član broj: 29116
Poruke: 387
*.151.eunet.yu.



+9 Profil

icon Re: Zasto ovo radi?!04.09.2005. u 12:54 - pre 197 meseci
Ajoj...proverio sam kod... Ovo zaista moze da bude katastrofalno.

I da... sa nekim klasama se to ne desava... da je u pitanju bio neki moj objekat u onom mom primeru... to se ne bi desilo...prijavio bi run time gresku.

[Ovu poruku je menjao Goran Arandjelovic dana 04.09.2005. u 13:58 GMT+1]
 
Odgovor na temu

Giga Moravac
Beograd

Član broj: 53929
Poruke: 6
*.164.nat-pool-bgd.sbb.co.yu.



Profil

icon Re: Zasto ovo radi?!05.09.2005. u 13:05 - pre 197 meseci
A zasto ovo radi na linux-u, a na XP program(i) pucaju (borland free kompajler)?
 
Odgovor na temu

X Files
Vladimir Stefanovic
Pozarevac

SuperModerator
Član broj: 15100
Poruke: 4890
*.nat-pool.po.sbb.co.yu.

Jabber: xfiles@elitesecurity.org


+633 Profil

icon Re: Zasto ovo radi?!05.09.2005. u 17:39 - pre 197 meseci
Kod mene (Borland C++Builder) takodje su primeri radili... A mislim da je odgovor
na to pitanje - PONAŠANJE JE NEDEFINISANO ZA TAKAV KOD. Može slučajno da
radi, ali kada ima puno više alociranih objekata - program definitivno puca...

 
Odgovor na temu

rumpl

Član broj: 54959
Poruke: 156
*.net81-65-32.noos.fr.



Profil

icon Re: Zasto ovo radi?!05.09.2005. u 21:05 - pre 197 meseci
Moje skromno mislljenje...

Ovakve stvari sam vidjao kod nekih buffer overflow exploita. Stvar je u tome sto razne
arhitekture drugacije slociraju buffer memoriju. Pa cak i razni OS-ovi. Znam da MAC to
stvarno dobro radi, ima ogromni prstor rezervisan za stack.
Ako se neko igra sa C-om sigurno je video da ako ima char* koji mallocuje na 1024, biffer overflow
se javlja mnogo kasnije, kod mene je bilo 1036 sa gcc3.* a sad sa gcc4.0 je 1044, ako se dobro secam. Znaci. sasvim je "normalno", ali predpostavljam da ne vazi za objekte jer je alociranje drugacije.
Nadam se da sam bio jasan, nisam mnogo citao odgovore od drugih, tako da ako je neko vec
odgovorio kao ja, ili ako sam skrenuo sa teme izvinjavam se.

Pozdrav
"The problem with the world is that everyone is a few drinks behind."
-Humphrey Bogart
 
Odgovor na temu

itf
Zagreb

Član broj: 59794
Poruke: 993
*.bar.novatv.hr.



+9 Profil

icon Re: Zasto ovo radi?!06.09.2005. u 01:28 - pre 197 meseci
Napravio sam simulaciju u Assembleru. Sve je ok dok se adresiraju slobodne memorijske lokacije. Ako se naleti na neku zazuzetu tada program puca. Zbog toga se i vrši dinamička (statiča) alokacija da bi te memorijske lokacije bile 100% slobodne, a dok će npr. funkcija realloc pri realociranju memorije ako naleti na zauzetu mem. lokaciju cijeli mem. blok koji treba biti realociran prekopirati na drugo mjesto da zaobiđe ovu zauzetu mem. lokaciju i spriječi pucanje programa.

[Ovu poruku je menjao itf dana 06.09.2005. u 02:52 GMT+1]
 
Odgovor na temu

[es] :: C/C++ programiranje :: Zasto ovo radi?!

[ Pregleda: 2848 | Odgovora: 8 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.