Wiso funktioniert jetzt das nicht.



  • wieso denn nicht? Das ist imho richtig.



  • Es spielt keine Rolle, ob "char" "signed" oder "unsigned" ist, da in diesem Fall nur mit positiven, nichtnegativen Ganzzahlen zwischen 0 und 127 gerechnet wird, konkret sogar nur 65 bis 90 ('A'..'Z') und 97 bis 122 ('a'..'z') (ASCII).

    Doch, es spielt eine erhebliche Rolle. Wenn char unsigned ist, ist A - a = 65 - 97 = 224 = Ó.

    Mit Buffern hat das schonmal gar nix zu tun.

    <a href= schrieb:

    http://de.wikipedia.org/wiki/Buffer_Overflow">Im Wesentlichen können bei einem Bufferoverflow durch Fehler im Programm zu große Datenmengen in einen unterdimensionierten Speicherbereich geschrieben werden



  • Michael E. schrieb:

    Mit Buffern hat das schonmal gar nix zu tun.

    <a href= schrieb:

    http://de.wikipedia.org/wiki/Buffer_Overflow">Im Wesentlichen können bei einem Bufferoverflow durch Fehler im Programm zu große Datenmengen in einen unterdimensionierten Speicherbereich geschrieben werden

    Es ist kein Bufferoverunderirgendwasflow!

    Es werden auch nicht zu große Datenmengen geschrieben. Du schreibst ein (unsigned) char in ein (unsigned) char. Beide sind gleich groß. Punkt.
    Schreib doch einfach Zahlenbereichsverletzung oder sowas.



  • Michael E. schrieb:

    Es spielt keine Rolle, ob "char" "signed" oder "unsigned" ist, da in diesem Fall nur mit positiven, nichtnegativen Ganzzahlen zwischen 0 und 127 gerechnet wird, konkret sogar nur 65 bis 90 ('A'..'Z') und 97 bis 122 ('a'..'z') (ASCII).

    Doch, es spielt eine erhebliche Rolle. Wenn char unsigned ist, ist A - a = 65 - 97 = 224 = Ó.

    das ist klar, weil char unsigned sind, deshalb haben wir 'a'-'A' gemacht und das funktioniert sicher.



  • supertux schrieb:

    das ist klar, weil char unsigned sind, deshalb haben wir 'a'-'A' gemacht und das funktioniert sicher.

    Ich weiß, dass es bei a-A keine Probleme gibt. Ich hab jetzt nur gesagt, wieso ich nicht mit dem Posting übereinstimme:

    Es spielt keine Rolle, ob "char" "signed" oder "unsigned" ist

    Es werden auch nicht zu große Datenmengen geschrieben. Du schreibst ein (unsigned) char in ein (unsigned) char. Beide sind gleich groß. Punkt.

    Und wie siehst du das hier?

    unsigned int a = 4294967295;
    unsigned int b = 1;
    unsigned int c = a + b;
    

    Binär:

    a:
    0 1111 1111 1111 1111 1111 1111 1111 1111
    
    b:
    0 0000 0000 0000 0000 0000 0000 0000 0001
    
    c:
    1 0000 0000 0000 0000 0000 0000 0000 0000
    

    Das Bit ganz links ist das 33. c = 0. Für mich ist das hier ein Speicherüb[quote]erlauf. Ich zitier dich nochmal:

    Es werden auch nicht zu große Datenmengen geschrieben.



  • Michael E. schrieb:

    Das Bit ganz links ist das 33. c = 0. Für mich ist das hier ein Speicherüberlauf.

    Für dich vielleicht. Für mich und meinen Compiler nicht:

    #include <stdio.h>
    #include <string.h>
    #include <limits.h>
    
    #define QED 0;
    
    unsigned int uint;
    unsigned int *ptr;
    
    int main(void){
            ptr=&uint;                                                          
            ptr++;
            memset(ptr,0,sizeof(unsigned int)); // illegal aber scheissegal
            uint=UINT_MAX;
    
            printf("Vorher:\n");
            printf("uint -> %u\n",uint);
            printf("*ptr -> %u\n",*ptr);
    
            uint++;
    
            printf("Nachher:\n");
            printf("uint -> %u\n",uint);
            printf("*ptr -> %u\n",*ptr);
    
            if(*ptr)
                    printf("Du hast Recht\n");
            else
                    printf("Ich habe Recht\n");
            return QED;
    }
    

    EDIT: Glückwunsch zum 1000. Beitrag 😉



  • Michael E. schrieb:

    Ich hab jetzt nur gesagt, wieso ich nicht mit dem Posting übereinstimme:

    Es spielt keine Rolle, ob "char" "signed" oder "unsigned" ist

    ok, da hast du schon Recht.



  • TactX schrieb:

    Für dich vielleicht. Für mich und meinen Compiler nicht:

    Wenns für den Compiler ein Fehler wär, wären Buffer Overflows nicht so berüchtigt. BTW programmier ich nicht in C.

    EDIT: Glückwunsch zum 1000. Beitrag 😉

    Das ist erst der hier. Eigentlich find ich die Postanzahl nicht so wichtig. Aber trotzdem danke 🙂



  • Michael E. schrieb:

    TactX schrieb:

    Für dich vielleicht. Für mich und meinen Compiler nicht:

    Wenns für den Compiler ein Fehler wär, wären Buffer Overflows nicht so berüchtigt.

    Hast du meinen Code überhaupt angeschaut? Natürlich ist es für den Compiler kein Fehler, aber das Programm beweist, dass der Inhalt der Adresse nach dem Integer (uint) nicht durch einen Überlauf in uint verändert wird. Und eben das hast du ja wohl behauptet.



  • Bei mir gibts nur ne Access Violation in Zeile 18...



  • Dann halt so.

    #include <stdio.h>
    #include <string.h>
    #include <limits.h>
    
    #define QED 0;
    
    unsigned int uint[2];
    
    int main(void){
    	memset(uint,0,sizeof(uint));
    	uint[0]=UINT_MAX;
    
    	printf("Vorher:\n");
    	printf("uint[0] -> %u\n",uint[0]);
    	printf("uint[1] -> %u\n",uint[1]);
    
    	uint[0]++;
    
    	printf("Nachher:\n");
    	printf("uint[0] -> %u\n",uint[0]);
    	printf("uint[1] -> %u\n",uint[1]);
    
    	if(uint[1])
    		printf("Du hast Recht\n");
    	else
    		printf("Ich habe Recht\n");
    	return QED;
    }
    

    Das erste Beispiel sollte nur zeigen, dass nicht reservierter Speicher nicht tangiert wird. Ist aber eigentlich egal ob er reserviert ist oder nicht...



  • Ist ja auch im Overflow Flag.



  • Ja und? Was juckt es C wenn irgendeine ALU einen Integeroverflow hat? Es wird nichts in fremden Speicher geschrieben, der eigene Speicherbereich wird niemals verlassen, es gibt nichtmal einen Buffer! _Wo_ ist hier der Bufferoverflow? Nirgends... kapier das endlich mal...



  • Aus welchem Grund sollte ein Prozessor, der einen Wert aus dem Speicher ins Register geladen hat, das Overflow-Flag irgendwo in den angrenzenden Speicher schreiben!? Ergibt für mich keinen Sinn. Buffer Overflows treten jedenfalls nur bei der Dereferenzierung von Pointern auf und sonst nicht.



  • Ich meine, wir reden die ganze Zeit aneinander vorbei. Ich hab gemeint, dass rein mathematisch ein falsches Ergebnis rauskommt, weil der Speicherbereich zu klein ist. Ich bin nicht davon ausgegangen, dass durch den zu geringen Speicherbereich andere Speichereinheiten außer dem Overflow Flag (so ähnlich hieß das doch) verändert wird. Und ich hab auch keine Definition von Buffer Overflow aufgeschlagen. Für mein Sprachverständnis fand hier ein Buffer Overflow statt. Wenn das nicht dem allgemeinen Sprachgebrauch entspricht, muss ich mir wohl Integer Overflow oder Zahlenbereichsverletzung (by TaktX) oder was auch immer angewöhnen. IMHO hab ich meinen Standpunkt zu ungenau beschrieben 😞



  • Michael E. schrieb:

    Ich meine, wir reden die ganze Zeit aneinander vorbei. Ich hab gemeint, dass rein mathematisch ein falsches Ergebnis rauskommt, weil der Speicherbereich zu klein ist.

    Es kommt kein falsches Ergebnis raus. unsigned-Arithmetik ist mathematisch wohldefiniert, in dem Sinne, daß die natürlichen Zahlen einfach durch eine modulo-UINT_MAX-Brille angesehen werden. Und da ist es eben definiert, daß UINT_MAX+1 == 0.



  • Daniel E. schrieb:

    Michael E. schrieb:

    Ich meine, wir reden die ganze Zeit aneinander vorbei. Ich hab gemeint, dass rein mathematisch ein falsches Ergebnis rauskommt, weil der Speicherbereich zu klein ist.

    Es kommt kein falsches Ergebnis raus. unsigned-Arithmetik ist mathematisch wohldefiniert, in dem Sinne, daß die natürlichen Zahlen einfach durch eine modulo-UINT_MAX-Brille angesehen werden. Und da ist es eben definiert, daß UINT_MAX+1 == 0.

    Ihr wisst ja, was ich meine.


Anmelden zum Antworten