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