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

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

Δημοσ. (επεξεργασμένο)

Καλησπέρα!Ένα μέρος της πτυχιακής μου(πιθανόν να μην το υλοποιήσω αν δεν θα έχει νόημα) θα περιλαμβάνει βοηθήματα σε φοιτητές,"νέους" προγραμματιστές εκτός απο κάποια άλλα πράγματα να μπορούν  μέσω ενός δικού μου API να βοηθιούνται στα χαζά για αρχή έτσι ώστε να μην πέφτουν σε κάποιες παγίδες.Τι θα γίνεται;Σάρωση του κώδικα και εντοπισμός σαν προειδοποίηση πιθανού λογικού λάθους.Η υπηρεσία που θα προσθέρω δεν θα κάνει σε καμιά περίπτωση μεταγλώττιση οπότε εννοείται πρέπει  το πρόγραμμα να έχει τεσταρτιστεί και να τρέχει κανονικά άρα runtime errors,ατέρμονα loops και λοιπά δεν πιάνονται.

 

Μερικά που έχω σκεφτεί και είναι λίγο πολύ global(όσο γίνεται πάντα) αν και μερικα IDE μπορεί να χτυπήσουν,πάντως φαντάζομαι δεν θα είναι και πολλά τα common mistakes

 

1 Switch case: Διάφορες περιπτώσεις όμως κανένα break

2 if  ( a = 1 ) : η χρήση τελεστή = αντί για ==

3 Χρήση μεταβλητής που δεν έχει αρχικοποιηθεί πχ int a,b;  b = a + 10 ; 

 

Δέν θέλω πχ κάτι με pointers όπου πχ η java βγαίνει εκτός

 

Ευελπιστώ να σας έρθει καμιά ιδέα και προφανώς και να την ρίξετε! :D

 

Edit:Εδω θα προσθέτω και άλλα που τυχόν βρήκα ή μου γράψατε,δεν πειράζει και ας φαίνονται δύσκολα θα βρώ ποιά μου κάνουν 

Επεξ/σία από Basiliseven
Δημοσ.

Σίγουρα αντιλαμβάνεσαι το επίπεδο της δυσκολίας για να κάνεις σωστά έστω και τα "απλά" που λες;

 

Βασικά θα χρειαστεί να φτιάξεις το frontend ενός compiler...

  • Like 3
Δημοσ.

Καταρχήν ευχαριστώ που μου απάντησες έστω και χωρίς την απάντηση που θα ήθελα.Προφανώς και έχεις δίκιο,σκοπός μου όμως δεν είναι βέβαια να φτιάξω έναν ολοκληρωμένο compiler αλλά μια πιο απλή δομή που θα σαρώνει τον κώδικα πχ γραμμή γραμμή και θα κάνει ενα pattern matching πχ με regex ή κάποια άλλη μέθοδο.Σαφώς θα χρησιμοποιήσω την λογική ενός λεκτικού-συνακτικού αναλύτη(πχ flex-bison)

 πχ για if(var = var )    έχουμε var: [A-Za-z_][A-Za-z_0-9]*  , βάζουμε έστω και  κενά μέσα για αρχή , άρα έχουμε 

if[ ]*[(][ ]*[A-Za-z_][A-Za-z_0-9]*[ ]*[=][ ]*[A-Za-z_][A-Za-z_0-9]*[ ]*[)] 

Δέν είπα οτι θα είναι τόσο απλό,πρόκειται για πτυχιακή άλλωστε .Λέω κιόλας στην αρχή ότι αυτό θα γίνει στα "χαζά",επειδή δεν είναι το κύριως κομμάτι της πτυχιακής μου αλλά είναι κάτι που θα ήθελα να έχει μέσα και αν υπάρχει έστω και σαν alpha-beta  ,καθώς σκοπεύω στο τέλος να το βάλω στο github έτσι ώστε να ασχοληθεί οποιοσδήποτε του φανεί ενδιαφέρον και θέλει να συνεισφέρει(στο συνολικό project πάντα).Άν πάλι είτε δεν έχω καλό αριθμό υλοποιήσιμων δειγμάτων είτε είναι πολύ δύσκολο θα το άφηνα προς το παρόν έξω απο την πτυχιακή

 

Υ.Γ2:Η υλοποίηση παραπάνω αποτελεί μια πρώτη προσέγγιση πάντα

Υ.Γ2:στο '_'  εχω κανει ενα λάθος στα vars αλλα γενικά αυτή ειναι η ιδέα 

Δημοσ.

Θα σου έλεγα να το ξεχάσεις τελείως αυτό γιατί δεν παίζει να γίνει έτσι. Καταλαβαίνω το σκεπτικό αλλά ακόμα κι αν καταφέρεις να κάνεις "κάτι", δε θα έχει κανένα νόημα για οποιονδήποτε άλλο εκτός από σένα που θα έχεις να πεις ότι έκανες ένα πράγμα παραπάνω. Φαντάζεσαι με πόσα δισεκατομμύρια τρόπους δε θα δουλέψει το regex-παράδειγμα και πόσο αδύνατο είναι να το κάνεις να δουλέψει πολύ καλά.

 

Απο κει και πέρα γλώσσα δεν είπες, τέτοια εργαλεία υπάρχουν πάρα πολλά και απο κει μπορείς να πάρεις ιδέα του τι κάνουν (και πώς είναι αναγκασμένα να το κάνουν).

  • Like 1
Δημοσ.

1 Switch case: Διάφορες περιπτώσεις όμως κανένα break

Σε γλώσσες που δεν είναι C;

 

2 if  ( a = 1 ) : η χρήση τελεστή = αντί για ==

Το χτυπάει ο gcc σαν warning. Σου προτείνει να περικυκλώσεις με παρενθέσεις την ύποπτη έκφραση. Επίσης αυτό εντάσσεται στα σημασιολογικά λάθη.

 

3 Χρήση μεταβλητής που δεν έχει αρχικοποιηθεί πχ int a,b;  b = a + 10 ;

Το χτυπάει ο gcc σαν warning. Επίσης παίζει αναλόγως με το specification της κάθε γλώσσας. Μπορεί να τα αρχικοποιεί όλα σε 0.

 

Πας να κάνεις ένα front-end ενός compiler. Γενικότερα δεν είναι δύσκολο να υλοποιηθούν αυτά. Απλά αν δεν έχεις κάνει τίποτα απέχεις "ένα απλό frontend με type-checking εννοείται" γραμμές κώδικα από το στόχο σου. Είναι αρκετές. Το ξέρω. Πολύ καλή δουλειά κάνει ο clang σε warnings. Δοκίμασε να βάλεις τα warnings στο τέρμα στα options και θα δεις ότι όλα υλοποιούνται. Άρα θα σου πρότεινα να βρεις κάτι που δεν έχει γίνει ακόμη και να το δουλέψεις πάνω στον clang/llvm. Αυτό έχει αρκετά θετικά. Θα ασχοληθείς με ένα πολύ γνωστό και άρτιο open-source project για compilers. Θα διαβάσεις πολύ καλό κώδικα ο οποίος ακολουθείται από ένα καλό documentation. Επίσης αν σου βγει, θα έχεις ήδη μπει στο παιχνίδι του contribution.

  • Like 1
Δημοσ.

Δέν θέλω πχ κάτι με pointers όπου πχ η java βγαίνει εκτός

 

Όταν λες ότι δεν θέλεις να βγει η java εκτός, εννοείς ότι το πρόγραμμά σου θα υποστηρίζει πολλές γλώσσες και όχι ας πούμε μόνο C ή μόνο java ? Αν ναι, τότε μιλάμε για ακόμη πιο δύσκολο εγχείρημα από ό,τι περιέγραψαν τα άλλα παιδιά.

 

Καλησπέρα!Ένα μέρος της πτυχιακής μου(πιθανόν να μην το υλοποιήσω αν δεν θα έχει νόημα)

 

1 Switch case: Διάφορες περιπτώσεις όμως κανένα break

2 if ( a = 1 ) : η χρήση τελεστή = αντί για ==

3 Χρήση μεταβλητής που δεν έχει αρχικοποιηθεί πχ int a,b; b = a + 10 ;

Δεν ξέρω πώς το εννοείς αυτό που τόνισα αλλά αν κατάλαβα σωστά τι θέλεις να κάνεις, τότε όντως δεν έχει νόημα :)

 

Αυτό που μπορείς να κάνεις, εφόσον αυτό το θέμα είναι μόνο ένα μέρος της πτυχιακής σου, είναι να εκμεταλλευτείς κάποιο από τα πάρα πολλά εργαλεία που υπάρχουν για αυτή τη δουλειά. πχ.

 

#include <stdio.h>

int main(void)
{
	int i, j;

	scanf("%d",&i);
	i += j;                 /* 3. unitialized */
	switch (i) {
	case 1: printf("1\n");  /* 1. no break */
	case 2: printf("1\n");
		break;
	}

	if (i = 5) {            /* 2. == */
		printf("5\n");
	}

	return 0;
}
% gcc --version
gcc (GCC) 4.9.3
% gcc -Wall tmp.c 
tmp.c: In function ‘main’:
tmp.c:15:2: προειδοποίηση: suggest parentheses around assignment used as truth value [-Wparentheses]
  if (i = 5) {            /* 2. == */
  ^
tmp.c:8:4: προειδοποίηση: ‘j’ is used uninitialized in this function [-Wuninitialized]
  i += j;                 /* 3. unitialized */
    ^
% clang --version
clang version 3.7.0 (tags/RELEASE_370/final)
% clang -Wall tmp.c 
tmp.c:15:8: warning: using the result of an assignment as a condition without
      parentheses [-Wparentheses]
        if (i = 5) {            /* 2. == */
            ~~^~~
tmp.c:15:8: note: place parentheses around the assignment to silence this
      warning
        if (i = 5) {            /* 2. == */
              ^
            (    )
tmp.c:15:8: note: use '==' to turn this assignment into an equality comparison
        if (i = 5) {            /* 2. == */
              ^
              ==
tmp.c:8:7: warning: variable 'j' is uninitialized when used here
      [-Wuninitialized]
        i += j;                 /* 3. unitialized */
             ^
tmp.c:5:10: note: initialize the variable 'j' to silence this warning
        int i, j;
                ^
                 = 0
Εκτός από συντακτικά και λογικά λάθη, οι σύγχρονες εκδόσεις των gcc, clang έχουν διάφορους sanitizers οι οποίοι βρίσκουν πάρα πολλά περισσότερα πράγματα όπως υπερχείλιση ακεραίων, απροσδιόριστη συμπεριφορά, κτλ.

 

% sparse -Wsparse-all tmp.c 
tmp.c:15:15: warning: assignment expression in conditional
Με παραξενεύει που το sparse δεν βρήκε τα υπόλοιπα. Πάντως υποστηρίζει πάρα πολλά πράγματα.

 

% splint tmp.c 

tmp.c: (in function main)
tmp.c:7:2: Return value (type int) ignored: scanf("%d", &i)
  Result returned by function call is not used. If this is intended, can cast
  result to (void) to eliminate message. (Use -retvalint to inhibit warning)
tmp.c:8:7: Variable j used before definition
  An rvalue is used that may not be initialized to a value on some execution
  path. (Use -usedef to inhibit warning)
tmp.c:11:7: Fall through case (no preceding break)
  Execution falls through from the previous case (use /*@fallthrough@*/ to mark
  fallthrough cases). (Use -casebreak to inhibit warning)
tmp.c:15:6: Test expression for if is assignment expression: i = 5
  The condition test is an assignment expression. Probably, you mean to use ==
  instead of =. If an assignment is intended, add an extra parentheses nesting
  (e.g., if ((a = ) ...) to suppress this message. (Use -predassign to
  inhibit warning)
tmp.c:15:6: Test expression for if not boolean, type int: i = 5
  Test expression type is not boolean or int. (Use -predboolint to inhibit
  warning)

Finished checking --- 5 code warnings
Όπως βλέπεις αναγνωρίζονται όλες οι περιπτώσεις. Καταλαβαίνω ότι αυτές οι 3 περιπτώσεις ήταν απλά μια αρχή και στο τελικό στάδιο θα έλεγχες πολλές περισσότερες καταστάσεις αλλά το πιο πιθανό (έως σχεδόν σίγουρο) είναι αυτές τις καταστάσεις τις βρίσκουν και αυτά τα προγράμματα.

 

Παρόμοια εργαλεία υπάρχουν για όλες τις γλώσσες και μάλιστα σε γλώσσες όπως η Java που είναι πιο strict από την C, τα εργαλεία μπορούν να βρουν πιο εύκολα περίεργες καταστάσεις.

 

Έτσι μπορείς να χρησιμοποιήσεις αυτά τα εργαλεία αντί να φας χρόνο να υλοποιήσεις ξανά τον τροχό (ειδικά εφόσον μιλάμε για μέρος της πτυχιακής και όχι το αντικείμενό της).

  • Like 2
Δημοσ.

1 Switch case: Διάφορες περιπτώσεις όμως κανένα break

 

2 if  ( a = 1 ) : η χρήση τελεστή = αντί για ==

 

3 Χρήση μεταβλητής που δεν έχει αρχικοποιηθεί πχ int a,b;  b = a + 10 ;

Εντάξει και ας χτυπάνε σαν warnings δεν με πειράζει θα κάνω λογικά το ίδιο.Άλλωστε πχ php ή javascript πολλά άτομα γράφουν σε notepad++ ή στην c/c++ κάποια άτομα γράφουν ακόμα για κάποιο λόγο σε dev-c++.

Πας να κάνεις ένα front-end ενός compiler. Γενικότερα δεν είναι δύσκολο να υλοποιηθούν αυτά. Απλά αν δεν έχεις κάνει τίποτα απέχεις "ένα απλό frontend με type-checking εννοείται" γραμμές κώδικα από το στόχο σου. Είναι αρκετές. Το ξέρω. Πολύ καλή δουλειά κάνει ο clang σε warnings. Δοκίμασε να βάλεις τα warnings στο τέρμα στα options και θα δεις ότι όλα υλοποιούνται. Άρα θα σου πρότεινα να βρεις κάτι που δεν έχει γίνει ακόμη και να το δουλέψεις πάνω στον clang/llvm. Αυτό έχει αρκετά θετικά. Θα ασχοληθείς με ένα πολύ γνωστό και άρτιο open-source project για compilers. Θα διαβάσεις πολύ καλό κώδικα ο οποίος ακολουθείται από ένα καλό documentation. Επίσης αν σου βγει, θα έχεις ήδη μπει στο παιχνίδι του contribution.

Ενδιαφέρον όσα γράφετε.Θα μπώ πάλι το βράδυ θα τα τσεκάρω στην τελική θα το αφήσω το όλο project για το τέλος,θα τελειώσω την πτυχιακή και θα δώ αν χωράει και αυτό μετά μεσα μιας που και οι δυο μου λέτε κατηγορηματικά οτι δεν γίνεται έτσι όπως το έχω στο μυαλό μου.Οπότε αν θέλει να δώσεις και κανείς άλλος ιδέες είναι καλοδεχούμενος,θα ψάξω λίγο ακόμα και θα δώ αν θα μπεί στο standby.

 

Edit:Imitheos ίσως να μου έδωσες την πιο κατατοπιστική απάντηση ευχαριστώ και ναι (πιθανόν να μην έχει νόημα ) .Απλά το σκεφτόμουν σε σχέση με το υπόλοιπο project(σόρρυ δεν θα το γράψω) θα έκανε αρκετά ωραίο combo με κάποια πράγματα  :P.

 

Χαιρετώ επανέρχομαι το βράδυ

Δημοσ.

Νομίζω κατάλαβα κι εγώ τι θες να κάνεις. :) Ό,τι σου είπε ο imitheos. Δες τί κάνει αυτός [1, 2]. Πιστεύω θα είναι πιο χρήσιμη αυτή η λειτουργικότητα από το να κάνεις κάτι δικό σου.

 

Όλα αυτά αν σε πέτυχα. Καλή συνέχεια!

  • Like 1
Δημοσ.

Άλλωστε πχ php ή javascript πολλά άτομα γράφουν σε notepad++ ή στην c/c++ κάποια άτομα γράφουν ακόμα για κάποιο λόγο σε dev-c++.

Τι σε κάνει να πιστεύεις ότι αυτά τα άτομα θα χρησιμοποιήσουν κάποιο static code analysis tool; :P

  • Like 3
Δημοσ.

Gon1332 και hmitheos μάλλον με καλύψατε με αρκετό υλικό για τώρα.Δεν είμαι ακριβώς σίγουρος πώς θα το συνδυάσω με την υπόλοιπη πτυχιακή(ενοώντας διασύνδεση μέσω κάποιων API κλπ) αλλά πιστεύω κάτι θα βρώ.Να'στε καλά παιδιά

@llias95 θα χρησιμοποιηθεί για εκπαιδευτικούς λόγους το όλο πρόγραμμα για αυτό είπα για φοιτητές-νέους προγραμματιστές οπότε όποιος ήταν να το χρησιμοποιήσει ναι θα έμπαινε σε αυτή την διαδικασία btw πέθανα στο γέλιο με την υπογραφή σου και ταυτόχρονα με έκανε να αισθάνομαι άσχημα για τον εαυτό μου :P

  • Like 1

Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε

Πρέπει να είστε μέλος για να αφήσετε σχόλιο

Δημιουργία λογαριασμού

Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!

Δημιουργία νέου λογαριασμού

Σύνδεση

Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.

Συνδεθείτε τώρα
  • Δημιουργία νέου...