ΚΕΦΑΛΑΙΟ 19 ΠΡΟΓΡΑΜΜΑΤΙΖΟΝΤΑΣ ΓΙΑΑΞΙΟΠΙΣΤΙΑ ΑΞΙΟΠΙΣΤΙΑ
ΣΤΟΧΟΙ Να περιγράψουµε τεχνικές προγραµµατισµού για ανάπτυξη αξιόπιστων συστηµάτων Να συζητήσουµε την αποφυγή σφαλµάτων ελαχιστοποιώντας την χρήση δοµών που εµπεριέχουν λάθη Να περιγράψουµε την αρχιτεκτονική συστηµάτων ανεκτικά σε λάθη Να περιγράψουµε µεθόδους χειρισµού εξαιρέσεων 2
Θέµατα ου καλύ τονται Τεχνικές αποφυγής λαθών Αρχιτεκτονικές ανοχής σε σφάλµατα Χειρισµός εξαιρέσεων Αµυντικός προγραµµατισµός Παραδείγµατα προγραµµάτων 3
Εισαγωγή Οι αγοραστές λογισµικού απαιτούν από το λογισµικό να είναι αξιόπιστο και να µην περιέχει λάθη. Για κάποια µη κρίσιµα συστήµατα κάποια λάθη είναι ανεκτά Για τον σχεδιασµό εφαρµογών µε υψηλές απαιτήσεις αξιοπιστίας χρησιµοποιούνται κάποιες ειδικές τεχνικές έτσι ώστε να επιτευχθεί ο σκοπός 4
Σηµαντική βελτίωση στην αξιοπιστία του λογισµικού Βελτιωµένες τεχνικές Προγραµµατισµού Καλύτερες γλώσσες Προγραµµατισµού Καλύτερη ιαχείριση Ποιότητας 5
Σε ένα σύστηµα λογισµικού η αξιοπιστία µπορεί να βελτιωθεί χρησιµοποιώντας 3 συµπληρωµατικές στρατηγικές Α οφυγή Σφαλµάτων Το λογισµικό ανα τύσσεται µε τρό ο ου να µην εµ εριέχει σφάλµατα Ανοχή Σφαλµάτων Το λογισµικό σχεδιάζετε µε τέτοιο τρό ο έτσι ώστε τυχόν λάθη ου θα αρουσιαστούν να µην οδηγήσουν σε λήρη α οτυχία του συστήµατος Εντο ισµός Σφαλµάτων Πριν το σύστηµα αραδοθεί, τυχόν λάθη ου υ άρχουν να εντο ιστούν και να διορθωθούν 6
Α οφυγή Λαθών Η αποφυγή λαθών και η ανάπτυξη λογισµικού χωρίς λάθη εναπόκειται : Στην ύ αρξη τυ ικών ροδιαγραφών του συστήµατος Στην υιοθέτηση οργανωτικής οιοτικής φιλοσοφίας Στην υιοθέτηση ροσέγγισης α όκρυψης και Ενσωµάτωσης ληροφοριών στο ρόγραµµα Στην χρήση ισχυρά δοµηµένης γλώσσας ρογραµµατισµού Στον εριορισµό χρήσης δοµών.χ δείκτες 7
Εκθετική αύξηση του κόστους για αφαίρεση λαθών όσο αυτά µειώνονται Κόστος Ανά Λάθος Που Εντο ίζεται Πολύ Λίγα Λίγα Πολλά Αριθµός Υ ολει όµενων Λαθών 8
οµηµένος Προγραµµατισµός Παρουσιάστηκε το 1970 Προγραµµατισµός όπου αποφεύγονται τα gotos Σχεδίαση top-down Σηµαντικός γιατί προωθεί την σκέψη και την συζήτηση για θέµατα προγραµµατισµού 9
οµηµένος Προγραµµατισµός και Α οφυγή Σφαλµάτων οµές και Αντικείµενα που πρέπει να αποφεύγονται για µείωση σφαλµάτων είκτες είκτες ου αναφέρονται σε λανθασµένες εριοχές µνήµης µ ορεί να κάνουν corrupt τα δεδοµένα ό ως ε ίσης και να κάνουν το ρόγραµµα δυσανάγνωστο Χρήση ιακο ών Οι διακο ές µ ορεί να διακόψουν µια κρίσιµη λειτουργία α ό το να τελειώσει 10
υναµική Κατανοµή Μνήµης Η κατανοµή µνήµης κατά την εκτέλεση του ρογράµµατος µ ορεί να οδηγήσει σε υ ερχείλιση Αριθµοί κινητής υ οδιαστολής Είναι ανακριβής µε α οτέλεσµα να οδηγηθούµε σε λανθασµένες συγκρίσεις Παράλληλες ιεργασίες Μ ορεί να αρουσιαστούν σφάλµατα συγχρονισµού µεταξύ τους Αναδροµικές Υ ορουτίνες 11
Α όκρυψη Πληροφοριών Οι πληροφορίες πρέπει να είναι ορατές ΜΟΝΟ στα κοµµάτια του προγράµµατος που πρέπει να έχουν πρόσβαση σε αυτές Πλεονεκτήµατα 1. Αποφυγή corruption δεδοµένων από λάθος 2. Πρόβληµα σε ένα κοµµάτι δεν θα µεταδοθεί και σε άλλα 3. Όλες οι πληροφορίες είναι περιορισµένες και ο προγραµµατιστής κάνει λιγότερα λάθη 12
Χρήση δοµηµένων γλωσσών προγραµµατισµού ADA C++ Ανάθεση τύπων σε οντότητες που αντιστοιχεί στη λειτουργία τους και σε µοντέλα του πραγµατικού κόσµου typedef enum {red, redamber, amber, green} trafficlightcolor type POSITIVE is INTEGER range 1..MAXINT 13
Χρήση κλάσεων και αφαιρετικών τύπων STACK. Push (S, somevalue) S.Push (Somevalue) class Queue { public: Queue () ; ~Queue () ; void Put ( int x ) ; // adds an item to the queue int Remove () ; // this has side effect of changing the queue int Size( ) ; // returns number of elements in the queue private: int front, back ; int qvec [100] ; } ; 14
Χρήση κλάσεων γενικής χρήσης template <class elem> class Queue { public: Queue ( int size = 100 ) ; // default to queue of size 100 elements ~Queue () ; void Put ( elem x ) ; elem Remove ( ) ; // this has side effect of changing queue int Size ( ) ; private: int front, back ; elem* qvec ; } ; 15
Ανοχή Σφαλµάτων Ένα σύστηµα ανεκτικό σε σφάλµατα µπορεί να συνεχίσει την λειτουργία του µετά από παρουσίαση σφάλµατος. Υπηρεσίες που πρέπει να διαθέτει ένα σύστηµα ανεκτικό στα σφάλµατα : 16
Εντο ισµός Α οτυχίας Το σύστηµα ρέ ει να εντο ίζει τυχόν α οτυχίες Αξιολόγηση Ζηµιάς Εντο ισµός των µερών του συστήµατος ου ε ηρεάστηκαν α ό την α οτυχία Ανάκτηση α ό Σφάλµα Το σύστηµα ρέ ει να ανακτήσει την κατάσταση του στην τελευταία γνωστή ασφαλή κατάσταση Ε ιδιόρθωση Σφάλµατος Τρο ο οίηση του συστήµατος έτσι ώστε να µην ε αναληφθεί το σφάλµα, µόνο εφόσον χρειάζεται 17
Αξιο ιστία Υλικού(hardware) Με Χρήση TMR A1 A2 Output comparator A3 18
Προσεγγίσεις για παροχή λογισµικού ανεκτικού στα σφάλµατα Προγραµµατισµός Ν-εκδόσεων Blocks Ανάκτησης 19
Προγραµµατισµός Ν-εκδόσεων Σχεδιάζονται Ν διαφορετικές εκδόσεις του συστήµατος από διαφορετικές οµάδες. Όλες οι εκδόσεις τρέχουν παράλληλα και τα αποτελέσµατα που επιστρέφει κάθε έκδοση συγκρίνονται και επιλέγετε η πλειοψηφία Υποθέτουµε ότι υπάρχει πολύ χαµηλή πιθανότητα να κάνουν όλες οι οµάδες τα ίδια λάθη Είναι εµπειρικά αποδεδειγµένο ότι όλες οι οµάδες καταλαβαίνουν λανθασµένα τις προδιαγραφές και χρησιµοποιούν τους ίδιους αλγορίθµους στις εκδόσεις που αναπτύσσουν 20
Προγραµµατισµός Ν-εκδόσεων ΕΚ ΟΣΗ 11 ΕΚ ΟΣΗ 2 ΕΚ ΟΣΗ 3 ΣΥΓΚΡΙΣΗ ΑΠΟΤΕΛΕΣΜΑΤΩΝ ΕΛΕΓΜΕΝΟ ΑΠΟΤΕΛΕΣΜΑ Ν-ΕΚ ΟΣΕΙΣ 21
Blocks Ανάκτησης Κάθε έκδοση υλοποιείτε µε διαφορετικό αλγόριθµο Η εκτέλεση γίνετε σειριακά Ο έλεγχος αποδοχής πρέπει να είναι ανεξάρτητος από την µέθοδο που χρησιµοποιήθηκε για κάθε έκδοση 22
Blocks Ανάκτησης ΑΛΓΟΡΙΘΜΟΣ 11 ΟΚΙΜΗ ΑΛΓΟΡΙΘΜΟΥ 1 ΑΠΟΤΥΧΙΑ ΕΛΕΓΧΟΥ ΑΠΟ ΟΧΗΣ ΝΕΑ ΟΚΙΜΗ ΝΕΟΣ ΕΛΕΓΧΟΣ ΕΛΕΓΧΟΣ ΑΠΟ ΟΧΗΣ 1.ΣΥΝΕΧΙΣΗ ΕΚΤΕΛΕΣΗΣ 2.ΕΝΤΟΠΙΣΜΟΣ ΕΞΑΙΡΕΣΗΣ ΝΕΟΣ ΕΛΕΓΧΟΣ ΑΛΓΟΡΙΘΜΟΣ 2 ΑΛΓΟΡΙΘΜΟΣ 3 23
Χειρισµός Εξαιρέσεων Εξαίρεση σε ένα πρόγραµµα είναι ένα λάθος που παρουσιάζετε ή ένα αναπάντεχο γεγονός ΕΚΤΕΛΕΣΗ ΠΡΟΓΡΑΜΜΑΤΟΣ ΕΝΤΟΠΙΣΜΟΣ ΕΞΑΙΡΕΣΗΣ ΚΩ ΙΚΑΣ ΧΕΙΡΙΣΜΟΥ ΕΞΑΙΡΕΣΕΩΝ 24
Όταν η εξαίρεση εγερθεί σε υπορουτίνα εµφωλιασµένων υπορουτινών τότε πρέπει να «ξεδιπλωθεί» η δοµή των υπορουτινών A Β; Β; B C C; C; ΕΠΙΣΤΡΟΦΗ ΕΞΑΙΡΕΣΗΣ ΕΜΦΑΝΙΣΗ ΕΞΑΙΡΕΣΗΣ 25
void Control_freezer ( const float Danger_temp) { float Ambient_temp ; // try means exceptions will be handled in this block // Assume that Sensor, Temperature_dial and Pump are //objects which have been declared elsewhere try { while (true) { Ambient_temp = Sensor.Get_temperature () ; if (Ambient_temp > Temperature_dial.Setting () ) if (Pump.Status () == off) { Pump.Switch (on) ; Wait (Cooling_time) ; } else if (Pump.Status () == on) Pump.Switch (off) ; if ( Ambient_temp > Danger_temp ) throw Freezer_too_hot ( ) ; } // end of while loop } // end of exception handling try block // catch indicates the exception handling code. catch ( Freezer_too_hot ) Alarm.Activate () ; } 26
Ενσωµατωµένοι τύποι εξαιρέσεων στην ADA CONSTRAINED_ERROR NUMERIC_ERROR PROGRAMM_ERROR STORAGE_ERROR TASK_ERROR 27
Αµυντικός Προγραµµατισµός Είναι µια προσέγγιση στην ανάπτυξη λογισµικού όπου υποθέτουµε ότι στο πρόγραµµα υπάρχουν σφάλµατα Το πρόγραµµα περιέχει κώδικα για εντοπισµό και ανάκτηση από λάθη 28
Αµυντικός Προγραµµατισµός Τεχνικές που εισάγονται για υλοποίηση : Πρόληψη Σφάλµατος Αξιολόγηση Ζηµιάς Ανάκτηση α ό Σφάλµα 29
Πρόληψη Σφάλµατος Ο µεταφραστής της γλώσσας κάνει βασικούς ελέγχους Χρήση ενσωµατωµένων χειριστών εξαιρέσεων της γλώσσας(π.χ ADA) εν ελέγχονται σχέσεις µεταξύ µεταβλητών εν γνωρίζουµε σε ιο σηµείο εντο ίστηκε το σφάλµα Χρήση δηλώσεων στο πρόγραµµα για µεταβλητές έτσι ώστε να ελέγχονται οι τιµές τους 30
Αξιολόγηση Ζηµιάς Αξιολόγηση µερών της κατάστασης του συστήµατος που επηρεάστηκαν από το σφάλµα Ανάλυση της κατάστασης του συστήµατος για να κρίνουµε το µέγεθος του corruption που προκλήθηκε στα δεδοµένα Χρήση συναρτήσεων για έλεγχο εγκυρότητας δεδοµένων 31
Τεχνικές που εξαρτώνται από την κατάσταση συστήµατος και την εφαρµογή : Χρήση αθροισµάτων ελέγχου(checksums) στην ανταλλαγή δεδοµένων και ελέγχου ψηφίων για αριθµητικά δεδοµένα Χρήση εφεδρικών συνδέσµων ου εριέχουν δείκτες χρησιµο οιείτε για έλεγχο της ακεραιότητας των δοµών δεδοµένων Χρήση χρονοδιακο τών στα αράλληλα συστήµατα ου ελέγχουν για διεργασίες ου δεν έχουν τερµατιστεί 32
Ανάκτηση α ό Σφάλµα Είναι η διαδικασία τροποποίησης της κατάστασης του συστήµατος έτσι ώστε να ελαχιστοποιηθούν οι συνέπειες του σφάλµατος Προς τα Εµ ρός Ανάκτηση Εφαρµογή διορθώσεων σε µια corrupted κατάσταση συστήµατος Προς τα Πίσω Ανάκτηση Α οκατάσταση του συστήµατος σε µια γνωστή ασφαλή κατάσταση 33
Η προς τα εµπρός ανάκτηση εφαρµόζετε συνήθως όταν : Υ άρχει φθορά κωδικο οιηµένων δεδοµένων Υ άρχει φθορά διασυνδεδεµένων δοµών 34
Void Safe_Sort (int* X, int N, err_status & Err) { Int* Copy = new int [N] For ( int i=0;i<n;i++) Copy [i]=x [i] Try { //κώδικας ταξινόµησης Err=OK; For ( i=0;i<n-1;i++) If ( X [i]>x[i+1]) throw sort_error; } Catch (sort_error) { For ( i=0;i<n-1;i++) X [i]=copy [i]; Err=failure; } Delete [] Copy; } 35