Εκσφαλμάτωση προγράμματος
Κεφ. 13 · Βιβλίο 2 Ενότητα 5 · Κατηγορίες λαθών, εκσφαλμάτωση, μέθοδος «Μαύρο Κουτί»
Το 1999 η NASA έχασε το διαστημόπλοιο Mars Climate Orbiter, αξίας εκατοντάδων εκατομμυρίων δολαρίων: ένα πρόγραμμα έδινε αποτελέσματα σε αγγλοσαξονικές μονάδες και ένα άλλο τα διάβαζε σαν μονάδες SI. Κανένα από τα δύο δεν «κράσαρε» — απλώς έδιναν λάθος αποτελέσματα.
Τα προγράμματα σπάνια είναι σωστά με την πρώτη. Η εκσφαλμάτωση είναι η τέχνη να βρίσκεις και να διορθώνεις τα λάθη — και στις Πανελλαδικές εμφανίζεται ως «βρες και διόρθωσε τα λάθη στο τμήμα».
Κατηγορίες λαθών
1. Συντακτικά λάθη: παραβιάζουν τους κανόνες σύνταξης της γλώσσας — ανορθόγραφες εντολές, ξεχασμένο ΤΕΛΟΣ_ΑΝ, αδήλωτη μεταβλητή, ΑΝ χωρίς ΤΟΤΕ. Εντοπίζονται από τον μεταγλωττιστή ή τον διερμηνευτή πριν από την εκτέλεση και είναι τα ευκολότερα στη διόρθωση.
2. Λάθη που οδηγούν σε αντικανονικό τερματισμό: το πρόγραμμα είναι συντακτικά σωστό, αλλά κατά την εκτέλεση βρίσκεται σε κατάσταση που δεν μπορεί να χειριστεί και διακόπτεται. Παραδείγματα:
- διαίρεση με το μηδέν (π.χ. μέσος όρος όταν δεν δόθηκε καμία τιμή)
- δείκτης πίνακα εκτός ορίων (Α[0] ή Α[Ν + 1])
- τετραγωνική ρίζα αρνητικού, λογάριθμος μη θετικού αριθμού
- εκχώρηση τιμής ασύμβατου τύπου (π.χ. πραγματική τιμή σε ακέραια μεταβλητή)
3. Λογικά λάθη: το πρόγραμμα εκτελείται κανονικά μέχρι το τέλος, αλλά δίνει λάθος αποτελέσματα. Οφείλονται σε λάθη στη λογική του αλγορίθμου (λάθος συνθήκη, αρχικοποίηση, τύπος). Είναι τα δυσκολότερα στον εντοπισμό, γιατί ο υπολογιστής δεν δίνει κανένα μήνυμα.
Ένα πρόγραμμα υπολογισμού μέσου όρου εκτελείται κανονικά, αλλά εμφανίζει πάντα αποτέλεσμα μεγαλύτερο από το σωστό, γιατί ο αθροιστής αρχικοποιείται με 1. Τι λάθος είναι;
Εκσφαλμάτωση
Εκσφαλμάτωση (debugging) είναι η διαδικασία εντοπισμού και διόρθωσης των λαθών ενός προγράμματος. Βασικές τεχνικές:
- Πίνακας τιμών (ίχνος): εκτελούμε το πρόγραμμα «με το χέρι», καταγράφοντας την τιμή κάθε μεταβλητής μετά από κάθε εντολή.
- Ενδιάμεσες εκτυπώσεις: προσθέτουμε προσωρινές εντολές ΓΡΑΨΕ για να δούμε τιμές σε κρίσιμα σημεία.
- Εργαλεία του προγραμματιστικού περιβάλλοντος: βηματική εκτέλεση (μία εντολή τη φορά), σημεία διακοπής (breakpoints) και παρακολούθηση τιμών μεταβλητών.
Λογικά λάθη ανά δομή
- Δομές επιλογής: λάθος τελεστής σύγκρισης (> αντί για >=), λάθος οριακές τιμές, λάθος λογικός τελεστής (ΚΑΙ αντί για Η), περιπτώσεις που δεν καλύπτονται.
- Δομές επανάληψης: λάθος αρχικοποίηση, μία επανάληψη παραπάνω ή λιγότερο (π.χ. < αντί για <=), ατέρμονη επανάληψη, επεξεργασία της τιμής τερματισμού.
- Πίνακες: δείκτης εκτός ορίων, σύγχυση γραμμών και στηλών, λάθος όρια στα ΓΙΑ, αθροιστής που δεν μηδενίζεται ανά γραμμή.
- Υποπρογράμματα: λάθος αριθμός, σειρά ή τύπος παραμέτρων, συνάρτηση χωρίς εκχώρηση στο όνομά της, χρήση μεταβλητής που δεν περάστηκε ως παράμετρος.
Παράδειγμα 1: Βρες και διόρθωσε τα λάθη. Το τμήμα πρέπει να εμφανίζει το άθροισμα και το πλήθος των θετικών στοιχείων του Α[50].
Σ ← 0 ΓΙΑ i ΑΠΟ 0 ΜΕΧΡΙ 50 ΑΝ Α[i] >= 0 ΤΟΤΕ Σ ← Σ + Α[i] πλ ← πλ + 1 ΤΕΛΟΣ_ΕΠΑΝΑΛΗΨΗΣ ΓΡΑΨΕ Σ, πλ
Λύση:
- Λείπει το ΤΕΛΟΣ_ΑΝ → συντακτικό λάθος.
- Το i ξεκινά από 0 → Α[0] εκτός ορίων → αντικανονικός τερματισμός. Διόρθωση: ΓΙΑ i ΑΠΟ 1 ΜΕΧΡΙ 50.
- Το πλ δεν αρχικοποιείται → πρόσθεσε πλ ← 0 πριν από το ΓΙΑ.
- Η συνθήκη >= 0 μετράει και τα μηδενικά, που δεν είναι θετικά → λογικό λάθος. Διόρθωση: Α[i] > 0.
Η μέθοδος ελέγχου «Μαύρο Κουτί»
Στη μέθοδο «Μαύρο Κουτί» (black box) ελέγχουμε το πρόγραμμα χωρίς να κοιτάμε τον κώδικα: το αντιμετωπίζουμε σαν κουτί που δέχεται εισόδους και παράγει εξόδους, και ελέγχουμε αν για κάθε είσοδο η έξοδος είναι η αναμενόμενη.
Επειδή δεν μπορούμε να δοκιμάσουμε όλες τις πιθανές εισόδους, επιλέγουμε έξυπνα δεδομένα ελέγχου:
- Κατηγορίες (κλάσεις) ισοδυναμίας: χωρίζουμε τις εισόδους σε ομάδες που αναμένεται να συμπεριφέρονται ίδια και δοκιμάζουμε μία τιμή από κάθε ομάδα — έγκυρες και μη έγκυρες.
- Οριακές τιμές: δοκιμάζουμε τις τιμές πάνω, λίγο κάτω και λίγο πάνω από κάθε όριο, γιατί εκεί «κρύβονται» τα περισσότερα λάθη (π.χ. > αντί για >=).
Θέμα τύπου Πανελλαδικών: Ένα πρόγραμμα διαβάζει τον βαθμό ενός μαθητή (ακέραιος 0–20) και εμφανίζει «Άριστα» για 18–20, «Προάγεται» για 10–17, «Απορρίπτεται» για 0–9 και «Λάθος βαθμός» για οτιδήποτε άλλο. Να προτείνετε δεδομένα ελέγχου με τη μέθοδο του μαύρου κουτιού.
Λύση: Κατηγορίες: μη έγκυροι < 0, απορρίπτεται 0–9, προάγεται 10–17, άριστα 18–20, μη έγκυροι > 20.
- Μία τιμή από κάθε κατηγορία: -5 → Λάθος βαθμός · 5 → Απορρίπτεται · 14 → Προάγεται · 19 → Άριστα · 30 → Λάθος βαθμός
- Οριακές τιμές: -1 → Λάθος · 0 → Απορρίπτεται · 9 → Απορρίπτεται · 10 → Προάγεται · 17 → Προάγεται · 18 → Άριστα · 20 → Άριστα · 21 → Λάθος
Αν για 18 εμφανιστεί «Προάγεται», το πρόγραμμα πιθανότατα έχει > 18 αντί για >= 18 — λογικό λάθος που θα ξέφευγε αν δοκιμάζαμε μόνο «τυπικές» τιμές όπως 14 και 19.
Κατά τον έλεγχο «μαύρου κουτιού» ενός προγράμματος που δέχεται ηλικίες από 18 έως 65, ποια ομάδα τιμών είναι οι οριακές τιμές για το κάτω όριο;
Μέθοδος: άσκηση «βρες τα λάθη»
- Συντακτικά: έλεγξε ότι κάθε ΑΝ έχει ΤΟΤΕ και ΤΕΛΟΣ_ΑΝ, κάθε επανάληψη το τέλος της, κάθε μεταβλητή δηλώθηκε, οι λέξεις-κλειδιά είναι σωστές.
- Αντικανονικός τερματισμός: έλεγξε διαιρέσεις (μπορεί ο παρονομαστής να είναι 0;), δείκτες πινάκων (όρια των ΓΙΑ, i + 1, i − 1), Τ_Ρ και ΛΟΓ.
- Λογικά: έλεγξε αρχικοποιήσεις, τελεστές σύγκρισης στα όρια, ΚΑΙ/Η, σημείο του ΔΙΑΒΑΣΕ στο ΟΣΟ.
- Κάνε ίχνος με μικρά δεδομένα και οριακές τιμές.
- Για κάθε λάθος γράψε: γραμμή, κατηγορία, διόρθωση.
Παράδειγμα 2: Το τμήμα πρέπει να εμφανίζει τα γινόμενα 1·1 έως 5·5 (πίνακας προπαίδειας 5×5), αλλά «κολλάει». Βρες το λάθος με ίχνος.
i ← 1 ΟΣΟ i <= 5 ΕΠΑΝΑΛΑΒΕ j ← 1 ΟΣΟ j <= 5 ΕΠΑΝΑΛΑΒΕ ΓΡΑΨΕ i * j j ← j + 1 ΤΕΛΟΣ_ΕΠΑΝΑΛΗΨΗΣ ΤΕΛΟΣ_ΕΠΑΝΑΛΗΨΗΣ
Λύση: Ίχνος: για i = 1 εμφανίζονται 1, 2, 3, 4, 5 και το j γίνεται 6. Επιστρέφουμε στο εξωτερικό ΟΣΟ: το i μένει 1, αφού δεν αυξάνεται πουθενά, και η συνθήκη i <= 5 ισχύει για πάντα → ατέρμονη επανάληψη (λογικό λάθος — παραβιάζει την περατότητα). Διόρθωση: i ← i + 1 αμέσως πριν από το εξωτερικό ΤΕΛΟΣ_ΕΠΑΝΑΛΗΨΗΣ.
Ποιο από τα παρακάτω λάθη εντοπίζεται από τον μεταγλωττιστή;
Στις 9 Σεπτεμβρίου 1947 η ομάδα της Grace Hopper στο Harvard βρήκε έναν σκόρο κολλημένο σε ένα ρελέ του υπολογιστή Mark II. Τον κόλλησαν στο ημερολόγιο εργασιών με τη σημείωση «First actual case of bug being found» — ο όρος «bug» υπήρχε ήδη στη μηχανική, αλλά από τότε έγινε σύμβολο των λαθών λογισμικού. Και το 1996 ο πύραυλος Ariane 5 καταστράφηκε 37 δευτερόλεπτα μετά την εκτόξευση, από ένα λάθος μετατροπής ενός πραγματικού αριθμού σε ακέραιο που δεν χωρούσε.
Το τμήμα πρέπει να βρίσκει τη θέση του ελάχιστου στοιχείου του Α[10]. Περνά τον έλεγχο με τον πίνακα [-3, -8, -1, 4, …], αλλά αποτυγχάνει όταν όλα τα στοιχεία είναι θετικά. Βρες το λάθος και ποια δεδομένα ελέγχου «μαύρου κουτιού» το αποκαλύπτουν.
ελ ← 0 θ ← 0 ΓΙΑ i ΑΠΟ 1 ΜΕΧΡΙ 10 ΑΝ Α[i] < ελ ΤΟΤΕ ελ ← Α[i] θ ← i ΤΕΛΟΣ_ΑΝ ΤΕΛΟΣ_ΕΠΑΝΑΛΗΨΗΣ ΓΡΑΨΕ θ
Δοκίμασε πρώτα μόνος σου — μετά δες τη λύση
Η αρχική τιμή ελ ← 0 είναι αυθαίρετη. Αν υπάρχει αρνητικό στοιχείο, κάποια στιγμή ισχύει Α[i] < 0 και το αποτέλεσμα βγαίνει σωστό. Αν όμως όλα τα στοιχεία είναι θετικά, καμία σύγκριση Α[i] < 0 δεν ισχύει και εμφανίζεται θ = 0 — θέση που δεν υπάρχει (λογικό λάθος). Το αποκαλύπτει η κατηγορία ισοδυναμίας «όλα τα στοιχεία θετικά», π.χ. [5, 2, 9, …], για την οποία αναμένεται θ = 2. Διόρθωση: ελ ← Α[1], θ ← 1 και ΓΙΑ i ΑΠΟ 2 ΜΕΧΡΙ 10. Κανόνας: το ελάχιστο/μέγιστο ξεκινά από στοιχείο του πίνακα, ποτέ από αυθαίρετη σταθερά.
- Χαρακτηρισμός της διαίρεσης με το 0 ως συντακτικού λάθους: συμβαίνει κατά την εκτέλεση (αντικανονικός τερματισμός).
- «Αφού το πρόγραμμα έτρεξε, είναι σωστό.» Τα λογικά λάθη δεν εμφανίζουν μήνυμα.
- Έλεγχος μόνο με «τυπικές» τιμές: τα λάθη κρύβονται στις οριακές τιμές και στις μη έγκυρες εισόδους.
- Στο «βρες τα λάθη», διόρθωση χωρίς αναφορά της κατηγορίας του λάθους, όταν ζητείται.
- Συντακτικά λάθη: παραβίαση σύνταξης, εντοπίζονται από τον μεταφραστή, τα ευκολότερα.
- Αντικανονικός τερματισμός: διαίρεση με 0, δείκτης εκτός ορίων, Τ_Ρ αρνητικού, ΛΟΓ μη θετικού.
- Λογικά λάθη: λάθος αποτελέσματα χωρίς μήνυμα, τα δυσκολότερα.
- Εκσφαλμάτωση: ίχνος, ενδιάμεσες εκτυπώσεις, βηματική εκτέλεση, σημεία διακοπής.
- Μαύρο κουτί: έλεγχος εισόδων–εξόδων χωρίς κώδικα, με κατηγορίες ισοδυναμίας και οριακές τιμές.