Wiso funktioniert jetzt das nicht.
-
char Upper(char c) { if(c >= 'a' && c <= 'z') { return c - ('a' - 'A'); } else { return c; } } void StrUpper(char *str) { //Dhlosh Metablhton //Kurio Programma while(*str != '\0') { *str = Upper(*str); <== hier geht das programm kaput. str++; } }
-
Vielleicht weil char standardmäßig unsigned bei dir ist. Dann gibts nen Buffer-Underflow bei 'a' - 'A'. Rechne doch besser + 'A' - 'a'.
-
Geht doch. Dein Problem liegt wohl an der Deklaration des String.
Du benutzt wohl:
char *buffer = "test 123 ABC"; StrUpper(buffer);
Richtig ist aber:
char buffer[] = "test 123 ABC"; StrUpper(buffer);
weil man bei "char *buffer" nichts mehr verändern darf.
-
weil man bei "char *buffer" nichts mehr verändern darf.
Doch natürlich, nur ein Stringliteral darf man nicht verändern. Leider ist der C Standard Buggy und Stringliterale konvertieren implizit in ein char*, obwohl sie eigentlich char const* sind.
-
kingruedi schrieb:
weil man bei "char *buffer" nichts mehr verändern darf.
Doch natürlich, nur ein Stringliteral darf man nicht verändern. Leider ist der C Standard Buggy und Stringliterale konvertieren implizit in ein char*, obwohl sie eigentlich char const* sind.
Jo, sowas meinte ich auch. Dass man bei "char *buffer" nichts verändern darf, war scheiße ausgedrückt
-
Wau. Danke
-
> Dann gibts nen Buffer-Underflow
Es ist auch ein Buffer Overflow wenn man von dem negativen Bereich weider in den Positiven bereich kommt - Buffer Underflow meint etwas anderes
-
Master User schrieb:
*str = Upper(*str); <== hier geht das programm kaput.
Benutze man: toupper(3), das ist im Standard und sicherer, du brauchst das Rad nicht nochmal zu erfinden.
Außerdem wäre es richtig
return c + ('a' - 'A');
-
Michael E. schrieb:
Vielleicht weil char standardmäßig unsigned bei dir ist. Dann gibts nen Buffer-Underflow bei 'a' - 'A'. Rechne doch besser + 'A' - 'a'.
Haeh???
'a' - 'A' = 32 (0x20), da der ASCII-Code fuer 'a' = 97, fuer 'A' = 65.
Die Methode " c - ( 'a' - 'A' ) " ist Standard, und hat sich eingebuergert, weil sie auch mit dem EBCDIC Code funktioniert.
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).
Mit Buffern hat das schonmal gar nix zu tun.
Das hier ist ein Buffer Underflow:
char buf[10]; buf[-1] = '3';
Und das hier ein Buffer Overflow:
char buf[10]; buf[10] = '3';
-
Power Off schrieb:
Michael E. schrieb:
Vielleicht weil char standardmäßig unsigned bei dir ist. Dann gibts nen Buffer-Underflow bei 'a' - 'A'. Rechne doch besser + 'A' - 'a'.
Haeh???
dito.
@Michael: 'a'-'A' ist schon richtig, denn es gilt: 'a' > 'A'
-
Jo, hab mich vertan. Aber mit Power Offs Post stimme ich nicht ganz überein.
-
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.