Avatar billede nomak Nybegynder
18. august 2003 - 08:47 Der er 9 kommentarer og
1 løsning

Address out of bounds

(gdb) where
#0  0x280b1975 in ?? ()
#1  0x804babd in login (nick=0x5 <Address 0x5 out of bounds>,
    pass=0x8075ec5 "tis", fd=2) at test.c:731
#2  0x804b946 in login (nick=0x8075ec5 "tis",
    pass=0x5 <Address 0x5 out of bounds>, fd=0) at test.c:724
#3  0x804a28c in addslashes (a=0x5 <Address 0x5 out of bounds>)
    at test.c:388
#4  0x804c55a in check_nick (newnick=0x1 <Address 0x1 out of bounds>,
    fd=-1077937112) at test.c:976
#5  0x80494be in fputs ()


nogen der kan sige mig hvad det betyder? det har vel noget at gøre med det "Address out of bounds", og hvad kan jeg gøre for at forhindre mit program i at crashe på den måde?
Avatar billede jpk Nybegynder
18. august 2003 - 08:57 #1
Du tilgår sansynligvis noget hukommelse der ikke er initialiseret...
Et eksempel kan være:

int* Ints = new int[10];

Ints[9] = 123; // Okay
Ints[10] = 123; // Muligvis crash, da adressen er out of bounds
Avatar billede segmose Nybegynder
18. august 2003 - 09:04 #2
Hvis det ikke hjælper så vis lige koden for de funktioner der indeholder linie 724, 731 og 976 (hele filen er nok for meget).
Har du slået alle warnings til og set efter om der er nogen fejl der hedder noget med "use before initializing" eller lignende.
Avatar billede arne_v Ekspert
18. august 2003 - 09:26 #3
Vi bliver nødt til at se lidt kode ellers er den rent gætværk.
Avatar billede nomak Nybegynder
18. august 2003 - 09:51 #4
724
-------
sprintf(output, "Du chatter nu i <b>%s</b> (%i/%i)", room[user[fd].room_id].roomname, room[user[fd].room_id].numusers, room[user[fd].room_id].maxusers);
-------
728-732
-------
if ( user[fd].hidden == 0 )
{
    sprintf(output, "<b>%s</b> loggede ind kl. %s", user[fd].nick, time_make(1));
    write_system(output, user[fd].room_id);
}
-------
974-977
-------
if(numrows != 0) {
    write_private_system("Brugernavnet er optaget", fd);
    return 0;
}
Avatar billede arne_v Ekspert
18. august 2003 - 09:57 #5
Hvordan har fd det med user arrayet ?

fd skal være mindre end antal elementer !
Avatar billede nomak Nybegynder
18. august 2003 - 10:00 #6
fd kommer fra funktionen, altså

int noget(int fd)
{
  //gør noget med fd
  return 1;
}
Avatar billede segmose Nybegynder
18. august 2003 - 10:21 #7
#1  0x804babd in login (nick=0x5 <Address 0x5 out of bounds>,
    pass=0x8075ec5 "tis", fd=2) at test.c:731

Hvis jeg læser ovenstående rigtigt har nick en forkert værdi (0x5) hvilket
nok betyder at nick er uinitialiseret i nedenstående.

728-732
-------
if ( user[fd].hidden == 0 )
{
    sprintf(output, "<b>%s</b> loggede ind kl. %s", user[fd].nick, time_make(1) );
    write_system(output, user[fd].room_id);
}

#2 pass er nok uinitialiseret
#3 a er nok uinitialiseret
#4 fd er nok uinitialiseret
#0 og #5 er nok afledte af dette, jeg vil gætte på at du får brugt nogle af dine rutiner før du får initialiseret data, hvis det er C++ så lav en constructor der udfylder alle data felter i user, fx. nick = "UNINITIALIZED".
Avatar billede nomak Nybegynder
18. august 2003 - 10:33 #8
det er alm. C

hvad mener du med uinitialiseret?

den har da brugt variablen mange gange før, den gør det bare lige pludselig!
Avatar billede segmose Nybegynder
18. august 2003 - 11:14 #9
Prøv at udskrive værdierne af fd, user[fd].nick lige før de bruges i de ovennævnte linier.

if (fd < 0 || fd > MAXFDDUBRUGERNU))
  printf("fd har tvivlsom værdi = %d\n", fd);
if (user[fd].nick < 1024) // hvis adressen er mindre en 1024??? peger den ned i systemområdet
  printf("nick har tvivlsom værdi = %p\n", nick);
// samme med pass.
Avatar billede segmose Nybegynder
28. august 2003 - 09:00 #10
Hvad var der så galt?
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester