Hollosi Information eXchange /HIX/
HIX CODER 1822
Copyright (C) HIX
2003-05-13
Új cikk beküldése (a cikk tartalma az író felelőssége)
Megrendelés Lemondás
1 turbo c++1.01 hiba? (mind)  65 sor     (cikkei)
2 Re: turbo c 1.01 hiba? (mind)  13 sor     (cikkei)
3 Re: turbo c++1.01 hiba? ( 82 sor ) (mind)  13 sor     (cikkei)
4 turbo c++1.01 hiba? (mind)  23 sor     (cikkei)
5 Re: Soros port (mind)  55 sor     (cikkei)

+ - turbo c++1.01 hiba? (mind) VÁLASZ  Feladó: (cikkei)

Hi Otto!

On Mon, 12 May 2003, HIX CODER wrote:

> Felado :  [Hungary]
> Temakor: turbo c++1.01 hiba? ( 82 sor )
> Idopont: Sun May 11 19:44:53 CEST 2003 CODER #1821
> - - - - - - - - - - - - - - - - - - - - - - - - - - - -

Egybol megneztem, es a gyanu beigazolodott: a masodik menupont (ami
hibas), a leghosszabb, az ujsorral egyutt pont 20 karakter. A C ugy
tarolja a stringeket, hogy a vegukre rak egy lezaro 0-at, es nem ugy mint
a Pascal (Delphi), hogy a string elejen tarolja a hosszat. Sajnos a fix
meretu tomb, amibe tarolod a menuket, 20 karakter hosszu, es a strcpy ()
amikor bemasolja a lezaro 0-at, az rafest a string utani memoriateruletre,
ami mar a sorszam. A festes csak egy darab byte-nyi 0, tehat nem festi at
teljesen a sorszamot, ami egy int (4 bajt). De mivel az x86 architektura
big endian, ezert a legkisebb helyierteku bajt kovetkezik a memoriaban a
string utan :). Mivel 256-nal kevesebb menu van, ezert gyak-ilag
nullazodik. (ergo ez a hiba nem jott volna elo ilyen formaban egy
Macintosh-on vagy egy SUN UltraSparc-on).

Erre mondjak, hogy a C-vel vigyazni kell. Ha atfesti a memoriat az ember,
akkor a progi meg is csinalja. :)

Megoldas: noveld a string meretet, de meg jobb lenne, ha valami dinamikus
osztalyt hasznalnal.

> struct TMenupont{
>  char felirat[20];
>  int index;

ez a resz a lenyeg

> void menu_init(){
>  for(int i=0;i<=MENUK_SZAMA-1;i++){
>   menu.menupontok[i].index=i;
>   menu.menupontok[i].x_koord=X;
>   menu.menupontok[i].y_koord=Y+i;
>  }

Eloszor beallitod az indexeket.

>  strcpy(menu.menupontok[0].felirat, "Dolgozok felvitele\n");
>  strcpy(menu.menupontok[1].felirat, "Kiiratas kepernyore\n");

Az strcpy () itt csinal csunyat. :). Egyebkent az strcpy jogosan teszi oda
a 0-at. Mert ellenkezo esetben copyzas utan egy lezaratlan string
akarmilyen hosszu is lehetne (a memoriaban kovetkezo elso 0-ig tartana).

A hiba tipikus buffer overrun. Ha a progit bovithetove egeszitened ki
(API-val lehetne hozzaadni menupontot), akkor lehetne olyan rosszindulatu
API-t irni, ami ezt a hibat mint biztonsagi rest kihasznalva programkodot
futtatna.

Udv.

--

tocsa

 ---
| email:                        |
| homepage:  http://www.inf.bme.hu/~tocsa       |
 ---
+ - Re: turbo c 1.01 hiba? (mind) VÁLASZ  Feladó: (cikkei)

Alaptezis: MINDIG sajat magadban keresd a hibat! Ez egy _nagyon durva_ hiba len
ne egy komoly rendszerben, tehat igen valoszinu, hogy te kovetsz el valamit, am
it nem kene. A kod stilusat inkabb nem kommentalom, de a kovetkezo sorban:

strcpy(menu.menupontok[1].felirat, "Kiiratas kepernyore
");

nekem gyanus, hogy miert log at a zaro idezojel a kovetkezo sorba. Szerintem a 
[20]-as tombbol logsz ki, es a sorvegi '\0' karakter atkerul az indexbe.

medve

(webes bekuldes, a bekuldo gepe: proxy.graphisoft.hu)
+ - Re: turbo c++1.01 hiba? ( 82 sor ) (mind) VÁLASZ  Feladó: (cikkei)

+      Felado :  [Hungary]
+      Temakor: turbo c++1.01 hiba? ( 82 sor )
+      Idopont: Sun May 11 19:44:53 CEST 2003 CODER #1821


 + char felirat[20];
 + strcpy(menu.menupontok[1].felirat, "Kiiratas kepernyore\n");

A char felirat tomb hossza legyen 21, vagy hagyd el, hogy "kepernyore",
nyilvan oda fogsz kiiratni.
A \n valojaban ket karakter.
Udv,
Tibor
+ - turbo c++1.01 hiba? (mind) VÁLASZ  Feladó: (cikkei)

> =======================================================
> Felado :  [Hungary]
> Temakor: turbo c++1.01 hiba? ( 82 sor )
> Idopont: Sun May 11 19:44:53 CEST 2003 CODER #1821
> - - - - - - - - - - - - - - - - - - - - - - - - - - - -
> 
> 0. Dolgozok felvitele
> 0. Kiiratas kepernyore
> 2. File-ba

Ez:
>  char felirat[20];

>  strcpy(menu.menupontok[0].felirat, "Dolgozok felvitele\n");
>  strcpy(menu.menupontok[1].felirat, "Kiiratas kepernyore\n");

Tulleped a 20 karaktert es ossze-vissza ganyolod a memoriat.

Adj neki 40-et.

-- 
Vomberg István >
Chemotron Inc.   www.chemotron.hu
+ - Re: Soros port (mind) VÁLASZ  Feladó: (cikkei)

>
>
>Hogyan lehet Turbo Pascal-ban a soros portot vezérelni, vagy esteleg valahol 
>
- "Esteleg" int 14h, leiras pedig a Hhelp programban. DOS es Win3/Win9x 
alol mukodik. Idemasolom - remelem, hogy nagy vonalakban olvashato lesz:

AH Service
?????????????????????????????????????????????????
00H initialize communications port
Input: DX = port number (0-1)
AL = initialization parameter bit flags:
??7???6???5???4???3???2???1???0??
? baud rate ?parity ?stp?length ?
??????????????????????D(??????????
??????????? ????? ? ???????? word length
? ? ? 10=7 bits; 11=8 bits
? ? ???????????? stop bits 0=1; 1=2;
? ?????????????????? parity code
? x0=none; 01=odd; 11=even
???????????????????????????? baud rate 000=110; 100=1200
001=150; 101=2400
010=300; 110=4800
011=600; 111=9600
Output: AH = comm status (see below)

01H send a character out the selected RS-232 port
Input: DX = port number (0-1)
AL = character to send
Output: AL is preserved.
If bit 7 of AH is set, an error occurred and
AH (bits 6-0) = comm line status (see AH below)

02H receive a character from the selected RS-232 port
Input: DX = port number (0-1)
Output: AL is character received
AH is non-zero if an error occurred

03H get communications port status
Input: DX = port number (0-1)
Output: AX is communications port status
AH = line-control status AL = modem status
??????????????????????????????
bit 7: timeout bit 7: received line detect signal
bit 6: trans shift reg empty bit 6: ring indicator
bit 5: trans holding reg empty bit 5: data set ready
bit 4: break detect bit 4: clear to send
bit 3: framing error bit 3: delta recv line signal detect
bit 2: parity error bit 2: trailing edge ring detector
bit 1: overrun error bit 1: delta data set ready
bit 0: data ready status bit 0: delta clear to send

>van e err&.#.337;l valamilyen leírás az interneten?
>
- Ha lehet, ne irj HTML formazott levelet ide...

AGYKONTROLL ALLAT AUTO AZSIA BUDAPEST CODER DOSZ FELVIDEK FILM FILOZOFIA FORUM GURU HANG HIPHOP HIRDETES HIRMONDO HIXDVD HUDOM HUNGARY JATEK KEP KONYHA KONYV KORNYESZ KUKKER KULTURA LINUX MAGELLAN MAHAL MOBIL MOKA MOZAIK NARANCS NARANCS1 NY NYELV OTTHON OTTHONKA PARA RANDI REJTVENY SCM SPORT SZABAD SZALON TANC TIPP TUDOMANY UK UTAZAS UTLEVEL VITA WEBMESTER WINDOWS