[ LUGOS ] RH 5.0 in buggy buggy libi

Metod Kozelj metod.kozelj na rzs-hm.si
Sob Apr 11 15:11:20 CEST 1998


Howdy!

On Sat, 11 Apr 1998, Ales Horvat wrote:

> > Kako pa ti reces stringu, ki je zapisan kakor v zgornjem primeru? Saj je
> > isto, kot ce bi rekel
> > 
> > const char[] staticni_string="A tole zdej dela al ne?!?!";
> > fprintf (stderr, "%s\n", staticni_string);
> > 
> > ali pak? No ja, res ni v pravem pomenu besede staticni, pac pa konstantni.
> 
> Well; Konstante majo v "exe" fajlu tocno doloceno mesto in data segment
> (fajn za delat programe, ki imajo config kar v exeju). Ce pa izpises
> printf("Nekaj"); bo pa nekaj alociral tik pred izpisom in nimas sans, da
> bi ga kje prej "povozil".

In "exe" mora imeti nekje napisano, kaj naj v tako alocirani pomnilnik
zapise (konkreten string) da ga bo potem izpisal. Ker me je zanimalo, kako
konkretno stvar izgleda, sem prevedel tale programcek:

/\/\/\/\/\/\
#include <stdio.h>
#include <math.h>

int main()
{
   const char konstanta[]="Konstantni string";

   float sss;

   sss=0.1;
   sss=sin(sss);

   fprintf (stderr,"%s\n", konstanta);
   fprintf (stderr,"Deklarirani string\n");

   exit(0);
}
/\/\/\/\/\/\

Ko sem z less pogledal executable, sta bila oba niza fizicno cisto skupaj.
Med njiju se je vrinil le (prav tako cisto regularni niz) "%s", loceni pa
so bili z znakom ^@ (ne vem, ali je to NULL ali pak nekaj drugega).

Kar se tice vozenj preko nizov: nikjer ne pise, da stvar povozis namerno
(s kaksnim memcpy na znani naslov). Prav lahko se zgodi nenamerno. Pri
zgornjem primeru bi prav lahko skvaril izpis funkcije fprintf(), ce bi
nizu konstanta[] dodal se kaksen znak. In bi pri tem dobil SIGSEGV ali pa
tudi ne (ker ne bi sel cez mejo 'mojega' segmenta).

Peace!
  Mkx




Dodatne informacije o seznamu Starilist