Προς το περιεχόμενο

C Προβλημα με δυναμικη διχειριση μνημης.


antonis1245

Προτεινόμενες αναρτήσεις

  • Απαντ. 142
  • Δημ.
  • Τελ. απάντηση

Συχνή συμμετοχή στο θέμα

Ρε κοπέλια don't feed the troll! Όπως είπε πολύ σωστά και ο ημίθεος μπαίνει σε όλα τα νήματα και γράφει για να γράψει! Ειλικρινά έχω φρίξει με τις ανακρίβειες που έχω διαβάσει! Όσο για την M2000 απλά από ευγένεια και μόνο δεν έχω μιλήσει, τι να λέμε και από που να αρχίσουμε...οτι δεν γνώριζε τι ειναι version management...τους δεινόσαυρους περί λινουξ και αλλα πολλά, το μακαρόνι που ειναι όλος ο κώδικας, κλπ κλπ!

Ignorance is bliss...μην απαντάτε και θα βαρεθεί που θα πάει!

  • Like 3
Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Συγνώμη γιατί πρέπει να γνωρίζω το version management; Όπως έχω γράψει...έχω γράψει δικό μου πρόγραμμα που μου δείχνει διαφορές σε κώδικα της Link.png Site: Vb6

Εντέλει απροσάρμοστος  είναι αυτός που θέλει όλοι οι άλλοι να προσαρμόζονται σε αυτόν! Σου είπα όμως να ξεχάσεις αυτά που ξέρεις;

Για να πάρουμε τα ίσα μας λίγο!

Και αφού εδώ γράφουν λίγα άτομα ποια είναι η σπουδή να το "κοινοποιήσεις"; Μήπως δημιουργείς ντόρο για να "βαρεθώ" ή για να προκαλέσεις του διαχειριστές;

Φίλε μου από κακία σου βάζω 10..

Νομίζω πως μόνο οι κακομούτσουνοι είναι κακοί; Λες να κάνω λάθος;

  • Like 1
Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Ωραία, τώρα το μόνο που μένει είναι να σταματήσεις να σπαμάρεις μπούρδες και m2000 σε όποιο topic δε μπορεί να τρέξει αρκετά γρήγορα για να σου ξεφύγει.

 

Δε μπαίνω καν στον κόπο να απαντήσω στις τελευταίες μπούρδες ότι αυτό που κάνεις δεν είναι UB επειδή το δοκίμασες και δούλεψε.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

αυτό που κάνεις δεν είναι UB επειδή το δοκίμασες και δούλεψε.

 

(ασχετα με τον κωδικα του m2000 που δεν τον εχω δει κιολας) - Αν εχουμε ενα πρόγραμμα  στο οποίο κανουμε κατι το οποιο συμφωνα με το spec ειναι ub, αλλά δουλευει δοκιμασμένα για ολες τις περιπτωσεις που μας ενδιαφέρουν στο προγραμμα μας, τότε γιατί ειναι κακό να χρησιμοποιείται ; (ειλικρινής ερώτηση, δεν ξερω την απάντηση)

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Το ub είναι error το οποίο δεν μπορεί να πιάσει ο compiler. Για ποιο λόγο να γράψεις κάτι λάθος αντί να το γράψεις... Σωστα;

 

Πάντα είναι error; Πχ η αφαίρεση δεικτών διάβασα εδω ειναι ub, αλλά αν γινεται ελεγχόμενα δεν θα παρουσιάσει προβλημα σωστά; Ή σκεφτομαι κατι λαθος;

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

(ασχετα με τον κωδικα του m2000 που δεν τον εχω δει κιολας) - Αν εχουμε ενα πρόγραμμα  στο οποίο κανουμε κατι το οποιο συμφωνα με το spec ειναι ub, αλλά δουλευει δοκιμασμένα για ολες τις περιπτωσεις που μας ενδιαφέρουν στο προγραμμα μας, τότε γιατί ειναι κακό να χρησιμοποιείται ; (ειλικρινής ερώτηση, δεν ξερω την απάντηση)

In no particular order

  • Είσαι σίγουρος ότι "δουλεύει δοκιμασμένα σε όλες τις περιπτώσεις"; Για να είσαι σίγουρος θα έπρεπε να έχεις ένα σύνολο από τις "ενδιαφέρουσες" εισόδους στο πρόγραμμα και τη σωστή έξοδο του προγράμματος για καθεμία από αυτές. Αλλά αν ήξερες όλα αυτά τα πράγματα δε θα είχες λόγο να γράψεις το πρόγραμμα εξαρχής. Οπότε είτε τζάμπα το έγραψες είτε ο ισχυρισμός σου δεν ισχύει όπως τέθηκε και πρέπει να "χαλαρώσει".
  • Επειδή ακόμα κι αν αυτό το συγκεκριμένο πρόγραμμα δουλεύει, αν δε μάθεις να μη γράφεις UB (τουλάχιστον επίτηδες γιατι κατα λάθος δεν τη γλυτώνει κανείς) θα γίνει η ζημιά κάπου αλλού στο μέλλον. Για να μάθεις να μη γράφεις UB πρέπει να εξασκηθείς στο να την αναγνωρίζεις και στο να μαθαίνεις ποιές είναι οι εναλλακτικές προσεγγίσεις για κάτι που σου ήρθε από φυσικού αλλά είναι UB. Με τη λογική "οκ εδώ δεν πειράζει" δεν πρόκειται να μάθεις ποτέ.
  • Επειδή ακόμα κι αν το πρόγραμμα δουλεύει σήμερα, αύριο ακόμα και μια "αδύνατον αυτό να προκάλεσε πρόβλημα" αλλαγή μπορείς να προκαλέσεις πρόβλημα.

     

     

    Δε βρίσκω το link τώρα αλλά έχω διαβάσει πχ πραγματικό σενάριο όπου υπήρχε UB η οποία οδηγούσε στη συγκεκριμένη περίπτωση σε overwrite κάποιου global variable. Αυτό το variable τύχαινε να μη χρησιμοποιείται με ενδιαφέροντα τρόπο οπότε το πρόγραμμα "λειτουργούσε σωστά". Αργότερα κάποιος πρόσθεσε μια επιπλέον global. Ο linker αποφάσισε να τη βάλει στο virtual address Χ το οποίο είχε σαν αποτέλεσμα να μετατοπιστούν στο address space όλα τα globals απο κει και πέρα. Αυτό είχε σαν αποτέλεσμα το overwrite τώρα να γίνεται σε μια άλλη global η οποία ήταν πιο "ευαίσθητη", και κάαααααποια στιγμή μετά την πρακτική εμφάνιση του UB το πρόγραμμα κράσαρε λόγω της λάθος άσχετης τιμής στην άσχετη με την UB global variable. Θέλεις να το κάνεις debug αυτό; Καλή τύχη.

     

  • Σε σχέση με το παραπάνω, πόσο μάλλον αν αποφασίσεις να κάνεις καμια πιό σημαντική αλλαγή όπως π.χ. στον compiler, target arch, compilation flags, κλπ. Αυτό έχει επίσης σχέση και με το point #1. Την αλλαγή δε χρειάζεται καν να την κάνεις εσύ ο ίδιος, αν δώσεις το source αλλού μπορεί να την κάνει άλλος.
  • Επειδή αδυνατώ να σκεφτώ σενάριο όπου ξέρεις ότι έχεις UB, πού την έχεις και για ποιό λόγο την έχεις, αλλά το να τη φτιάξεις είναι για κάποιο λόγο περίπλοκο ζήτημα. Δεδομένου ότι είναι εφικτό να μη γράψεις UB σε οποιαδήποτε περίπτωση, το να ξέρεις ότι την έχεις και να μη τη φτιάχνεις παραπέμπει είτε σε τεμπελιά είτε σε έλλειψη γνώσεων. Τίποτα από τα δύο δεν είναι κάτι που θα ήθελα να με χαρακτηρίζει. Άρα πρέπει να φτιάξω την UB.
  • ...more? Νομίζω για τις ανάγκες της συζήτησης δεν είναι απαραίτητο.
Τώρα, that said, στη μάλλον απίθανη περίπτωση όπου
  • έγραψα ένα πρόγραμμα που είναι τελείως throwaway, ήταν για μια φορά και δε θα μπω καν στον κόπο να κρατήσω το source
  • η έξοδος που πήρα από το πρόγραμμα είναι "σωστή με το μάτι"
  • δε με ενδιαφέρει αν το αποτέλεσμα είναι 100% σωστό για οποιοδήποτε λόγο (ίσως τα δεδομένα εισόδου μου να είναι ανακριβή ή ελλιπή εξαρχής, ίσως να με ενδιαφέρει μόνο μια ballpark έξοδος, whatever)
  • είχα UB που δεν την κατάλαβα αλλά μετά κάποιος μου την επισήμανε
  • καταλαβαίνω το πρόβλημα που κάνει UB και ξέρω πώς να το φτιάξω
  • είμαι αρκετά έμπειρος για να μπορώ να κρίνω πότε οι κανόνες δεν είναι απαραίτητα για να τηρούνται
ε τότε μπορεί και να μην έμπαινα στον κόπο.

 

Πάντως το παραπάνω πακέτο συνθηκών είναι πολύ πιο σπάνιο από άλλο πακέτο με το οποίο π.χ. δε με νοιάζει αν έχει το πρόγραμμα memory leaks γιατί η μνήμη θα φτάσει σίγουρα για τη δουλειά που θέλω, το οποίο είναι ήδη σπάνια περίπτωση.

Πάντα είναι error; Πχ η αφαίρεση δεικτών διάβασα εδω ειναι ub, αλλά αν γινεται ελεγχόμενα δεν θα παρουσιάσει προβλημα σωστά; Ή σκεφτομαι κατι λαθος;

"Ελεγχόμενα" και "UB" δεν πάνε στην ίδια πρόταση. Εξού και το undefined.

Δε μπορείς να ξέρεις τι θα κάνει ο compiler, και δε μπορείς διαισθητικά ούτε να φανταστείς ποιές θα είναι οι συνέπειες στο τέλος της χιονοστιβάδας.

 

Παράδειγμα: https://blogs.msdn.microsoft.com/oldnewthing/20140627-00/?p=633/

  • Like 2
Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

(ασχετα με τον κωδικα του m2000 που δεν τον εχω δει κιολας) - Αν εχουμε ενα πρόγραμμα  στο οποίο κανουμε κατι το οποιο συμφωνα με το spec ειναι ub, αλλά δουλευει δοκιμασμένα για ολες τις περιπτωσεις που μας ενδιαφέρουν στο προγραμμα μας, τότε γιατί ειναι κακό να χρησιμοποιείται ; (ειλικρινής ερώτηση, δεν ξερω την απάντηση)

Συνήθως όταν κάποιος λέει "όλες τις περιπτώσεις" εννοεί ότι έκανε compile τον κώδικα και δοκίμασε όλες τις πιθανές εισόδους που μπορεί να δώσει ο χρήστης. Πχ μερικοί λένε "δοκίμασα όλες τις πιθανές τιμές και η υπερχείλιση signed ακεραίων έπαιξε όπως περίμενα".

 

Αν κάποιος όμως κάνει compile το πρόγραμμ με -O3 αντί για -O2 και αυτό αλλάζει την συμπεριφορά ώστε να μην παίζει ?

 

Αν αύριο βγει νέα έκδοση του compiler η οποία είναι πιο strict ή γενικά άλλαξε κάτι στην συμπεριφορά ? Σε περίπτωση που κάποιος το θεωρήσει απίθανο σενάριο, να πούμε ότι όχι μόνο δεν είναι καθόλου απίθανο αλλά συμβαίνει συνέχεια με συνέπεια να την έχουν πάθει και μεγάλα projects ακόμη. Ένα που μου έρχεται στο μυαλό είναι το userspace εργαλείο για τον firewall του linux το οποίο κατά λάθος χρησιμοποιούσε UB και έπαιζε χρόνια μέχρι που βγήκε ο gcc τάδε και έπαψε να παίζει :)

  • Like 2
Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Έχω περάσει ατελείωτες ώρες να γράφω και να διορθώνω κώδικα. Κοίταξα εδώ ότι κάποιοι είναι 23 χρόνων. Ε! λοιπόν διορθώνω κώδικα παραπάνω από 23 χρόνια! Χρησιμοποιώ την VB6 και κλήσεις στο λειτουργικό. Δεν υπάρχει τίποτα εύκολο. Ένα μεγάλο πρόβλημα που βρήκα κάποτε ήταν ένα πρόγραμμα που έτρεχε σε Xp και δεν έτρεχε σε 7. Κάποτε βρήκα αυτό που λες UB και στην Vb6. Λάθη που δεν πείραζαν στα XP με λάθη που πείραζαν στα 7. Όμως όποιος πιστεύει ότι θα φτιάξει ένα πρόγραμμα 30000 γραμμών και δεν θα έχει βρει όλα τα λάθη, ακόμα και τα λογικά...μάλλον είναι γελασμένος.

 

Το πρόγραμμα που έγραψα το δοκίμασα (το γράφω εδώ για τρίτη φορά μέχρι να γίνει κατανοητό).  Πράγματι βάσει του ορισμού UB θα μπορούσε να ερμηνεύσει ως UB το να χρησιμοποιήσω διαφορά νέου με παλιού δείκτη (που έχει γίνει free). Αλλά υπό τις υπάρχουσες συνθήκες και για το τελευταίο gcc σε Linux  δουλεύει.

 

Και αν τελικά φτιάξω ένα εκτελέσιμο και κρατήσω το εκτελέσιμο και πετάξω το κώδικα...το εκτελέσιμο θα δουλεύει και ας αλλάξει ο gcc και οτιδήποτε! Σε αυτό συμφωνείς ή όχι Defecer;

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Επισκέπτης
Αυτό το θέμα είναι πλέον κλειστό για περαιτέρω απαντήσεις.

  • Δημιουργία νέου...