Vanlige feil

Generelle retningslinjer

  1. Pass på at du har like mange free's som malloc's.
  2. Ha kontroll på pekerne dine: Hva peker de på? (stack eller heap?)
  3. Statisk minneallokasjon kan være mer hensiktsmessig enn dynamisk (se punkt 1).
  4. Husk å initialisere variabler før du bruker dem.
  5. Sjekk at du ikke forsøker å lese eller skrive utenfor allokert minne (se punkt 2). Pass på array-indekser.
  6. Gjør koden virkelig det du tror den gjør? Ta hensyn til warnings!
  7. Bruk verktøy som Valgrind og GDB.

Hva betyr...

  • error: dereferencing pointer to incomplete type.
    Dette er en feilmelding GCC spytter ut og betyr som regel at du forsøker å bruke en struct som ikke er deklarert.
    Husk alltid å inkludere headerfiler som inneholder funksjons- og struct-deklarasjoner.

  • Conditional jump or move depends on uninitialised value(s)
    Valgrind sier dette når du bruker en variabel som ikke er initialisert, dvs. at den ikke har fått en verdi.
    Legg merke til at variabelen det er snakk om ikke alltid er i den siste funksjonen, men godt kan være sendt som argument til funksjonen.

Gjengående feil

Det er spesielt to feil som går igjen i forhold til obligen og hjemmeeksamnene:

  1. Portnummer som blir sendt som argument til l4_send er høyere enn en MAX_PORTS og fører til segmentation fault i l4_recv.
    Husk at portene brukt i programmet ikke tilsvarer de reelle portene brukt av UDP, men at vi kun simulerer TSAP porter.
    MAX_PORTS er satt til 1024, så enten bruk en verdi lavere enn dette (f.eks. 0 ?) eller sett MAX_PORTS til en høyere verdi.
     
  2. Argumentet til register_timeout_cb er en peker til en verdi på stacken og ikke til heapen som det bør være.
    Dette fører til at man får rare verdier i ens callback-funksjon, fordi man rett og slett har skrevet over stacken i mellomtiden.
    Husk at den funksjonen du kaller register_timeout_cb i mest sannsynlig vil returnere før callback-funksjonen blir kalt, og dermed vil stacken antakeligvis være overskrevet med andre verdier.
    Ikke vær redd for å bruke malloc, så lenge du husker å bruke free også. :-)
     
  3. Lengdeargumentet gitt til memset, memcpy og tilsvarende funksjoner er større enn det faktiske allokerte minnet, slik at man skriver over minnet til andre variable.

 

Publisert 8. apr. 2010 13:08 - Sist endret 12. apr. 2010 12:54