Γιατί η C χρειάζεται γράφο κλήσεων και όχι grep
Η C δεν έχει κλάσεις ή αρθρώματα για να οργανώνουν τον κώδικα. Η δομή βρίσκεται στις κλήσεις συναρτήσεων, στις κεφαλίδες και στα structs, και το ίδιο όνομα μπορεί να εμφανιστεί σε σχόλια, μακροεντολές και σταθερές συμβολοσειρών. Οι μακροεντολές εξαγωγής και επισημείωσης περιβάλλουν δηλώσεις, και εκεί σκοντάφτουν τα εργαλεία που αναλύουν μόνο καθαρή C. Για έναν πράκτορα, το ασφαλές πρώτο βήμα είναι ο γράφος κλήσεων.
Το Maguyva χτίζει αυτόν τον γράφο, ώστε ένας πράκτορας να βλέπει πού φτάνει μια συνάρτηση και τι φτάνει σε αυτήν πριν προτείνει μια αλλαγή.
Τι εξάγει το Maguyva από τη C
Το Maguyva καλύπτει .c και .h. Οι ορισμοί συναρτήσεων εξάγονται ως σύμβολα, ενώ τα structs και τα unions μπορούν να επιλεγούν ως ορισμοί τύπων στη δομική αναζήτηση. Οι οδηγίες #include γίνονται σχέσεις εισαγωγής.
Οι μακροεντολές εξαγωγής και ορατότητας (μοτίβα όπως FOO_API, DLLEXPORT ή LIBEXPORT) και οι μακροεντολές επισημείωσης για ασφάλεια νημάτων (όπως GUARDED_BY και REQUIRES) καλύπτονται πριν από την ανάλυση, ώστε οι δηλώσεις που περιβάλλουν να αναλύονται κανονικά ως δηλώσεις. Τα σώματα των μακροεντολών τύπου συνάρτησης αναλύονται· τα σώματα των μακροεντολών τύπου αντικειμένου όχι.
Ο γράφος καταγράφει κλήσεις, συμπεριλήψεις, δημιουργία στιγμιοτύπων μέσω σύνθετων σταθερών, αναφορές τύπων, αναγνώσεις και εγγραφές, καθώς και ροή ελέγχου. Περίπου 124 κλήσεις της τυπικής βιβλιοθήκης της C (printf, malloc, free, memcpy, strlen και παρόμοιες) φιλτράρονται από τις σχέσεις, ώστε να ξεχωρίζει ο κώδικας του έργου.
Παραδείγματα προτροπών για πράκτορες
- «Ποιος καλεί τη
uart_write, απευθείας ή μέσω άλλων συναρτήσεων;» (dependency_search incoming)
- «Ποια αρχεία συμπεριλαμβάνουν το
config.h και ποια structs του χρησιμοποιούν;» (dependency_search, μετά find_symbol)
- «Εξήγησε πώς ένα πακέτο περνά από τη διακοπή λήψης στον αναλυτή του πρωτοκόλλου.» (
get_task_context)
Γνωστοί περιορισμοί
- Η C δεν έχει κλάσεις ούτε εξαιρέσεις, οπότε οι σχέσεις κληρονομικότητας, υλοποίησης interface, επικάλυψης, ρίψης και σύλληψης σημειώνονται ως μη εφαρμόσιμες.
- Το
.h εμφανίζεται στις λίστες επεκτάσεων της C, της C++ και της Objective-C, οπότε οι κεφαλίδες σε δέντρα πολλών γλωσσών μοιράζονται ανάμεσα σε αυτά τα προφίλ.
- Οι κλήσεις σε φιλτραρισμένες συναρτήσεις της τυπικής βιβλιοθήκης δεν είναι ακμές του γράφου. Χρησιμοποιήστε το
text_pattern_search όταν χρειάζεστε κάθε malloc ή memcpy.
Επόμενα βήματα
Συνδέστε ένα αποθετήριο με τον γρήγορο οδηγό εκκίνησης και έπειτα δείτε τον πίνακα υποστήριξης στη σελίδα συμβατότητας. Για κώδικα C++ στο ίδιο δέντρο, διαβάστε τον οδηγό για τη C++.