Δημοσιεύτηκε: 06 Σεπ 2011, 22:46
Star_Light έγραψε:Κατσε να τα συνδυασω τωρα και με τα 3 solutions που χεις δωσει στο buffer overflow στους ελεγχους....
- Κώδικας: Επιλογή όλων
if(p1)
{ free(p1);
p1=NULL;
}
Λοιπον η if γενικα ελέγχει την έκφραση μέσα στην παρενθεση της , αν αυτη δωσει μη μηδενικη τιμή μπορει να εκτελεστει , επομενως αν υπάρχει ο p1 (αν υπάρχει εννοουμε να δειχνει σε εγκυρα δεδομενα) τοτε ελευθερωσε τον και θεσε τον μετα σε NULL. Ειμαι σωστος εδω???
Σωστός! Μια διευκρίνηση όμως, το αν υπάρχει ο δείκτης σημαίνει να μην είναι NULL, το αν δείχνει όμως σε έγκυρη μνήμη ή όχι δεν μπορούμε να το ξέρουμε... πρέπει να έχουμε φροντίσει εμείς να δείχνει σε έγκυρη μνήμη πριν τον χρησιμοποιήσουμε (είτε δλδ να του έχουμε δεσμέυσει μνήμη μόνοι μας με calloc, είτε να τον έχουμε βάλει να δείχνει στη μνήμη μιας άλλης μεταβλητής, π.χ στην αρχή ενός πίνακα, ή σε ένα στοιχείο ενός πίνακα ή στη μνήμη μιας απλής μεταβλητής, κλπ).
έγραψε:επισης λες πως θα πρεπει να αρχικοποιουμε παντοτε τους δεικτες πριν τους χρησιμοποιησουμε... αρκετα λογικο μιας και ενας δεικτης μη αρχικοποιημενος μπορει να δειχνει οπουδηποτε ακομη και σε σημειο στην μνημη που μπορει να υπάρχουν χρησιμες εγγραφες του λειτουργικου συστηματος κτλπ επομενως καταλαβαινει κανεις αμεσως τις συνεπειες για την ασφαλεια και εδω. Επομενως παντα πρεπει να τους αρχικοποιουμε πριν τους χρησιμοποιησουμε ή να τους θέτουμε την τιμή NULL. Εκει δειχνουν παντα στο 0 δηλαδη? Αυτο που ειναι στην αρχη της μνημης?
Όχι δεν σημαίνει αρχή της μνήμης το NULL. Απλά ξέρουμε πως αν είναι NULL ο δείκτης δεν δείχνει σε άκυρη μνήμη... βασικά δεν δείχνει ΠΟΥΘΕΝΑ.
έγραψε:Επισης λες πως πρεπει να ελεγχεις να μην ειναι NULL ενας δεικτης πριν τον χρησιμοποιησεις... επειδη αμα τον θεσεις μεσα σε μια printf ας πουμε για εκτυπωση θα φας segmentation fault??????
Ναι! Βέβαια η printf κοιτάει αν είναι NULL πριν πάει να τον χρησιμοποιήσει οπότε δεν παράγει seg-fault, η puts() όμως δεν κοιτάει. Δοκίμασέ το να το δεις και στη πράξη:
- Κώδικας: Επιλογή όλων
int main( void )
char *s = NULL;
printf("%s\n", s); // δεν θα παράξει σφάλμα, γιατί η prinf ελέγχει αν είναι NULL το s πριν το χρησιμοποιήσει
puts( s ); // θα παράξει σφάλμα, γιατί η puts δεν ελέγχει αν είναι NULL το s... το χρησιμοποιεί χωρίς έλεγχο (άρα εδώ θα κρασάρει)