IRC Logs for #lost


2021-05-26

06:48:36 kevin joined the channel
07:46:48 Tufel joined the channel
07:52:50 Tufel: Huhu
08:13:48 XanClic joined the channel
08:35:03 kevin: Moin Tufel
13:29:14 LittleFox: hi
13:32:02 xq: heya
14:39:15 CubeCoder joined the channel
14:39:30 CubeCoder: hi
14:40:11 xq: huhu
14:40:24 CubeCoder: mal wieder ne frage
14:40:30 LittleFox: ohoh
14:42:18 CubeCoder: hab ne funktion wo in ein char * geschrieben werden soll aber das tut es nicht meine frage ist: warum? xD also ich habe halt ein nomales 'char * str = "";' und "befülle" es so: str[i] = 'O'; aber später ist das 'O' nicht da sondern einfach nichts
14:42:32 CubeCoder: haha xq
14:45:02 xq: das ist illegal! :D
14:45:09 xq: und zwar ist ein string literal immutable
14:45:18 xq: also du darfst dort nicht reinschreiben, der speicher ist konstant
14:45:36 xq: du brauchst speicher, in den du schreiben darfst, zum beispiel so:
14:45:40 CubeCoder: aber ich darf doch ein char in dem string mit nem anderen ersetzen oder?
14:45:47 xq: nicht in dem literal
14:45:58 CubeCoder: okay...
14:46:00 xq: das literal ist 1 byte lang, und das ist definiert 0
14:46:06 xq: und es ist read-onl
14:46:08 xq: *only
14:46:18 xq: char str[2] = {0}; // string, länge=0
14:46:24 xq: str[0] = 'O';
14:46:24 CubeCoder: okay also muss ich dem speicher geben?
14:46:32 xq: str[1] = 0; // wir brauchen wieder nullterminator
14:46:53 xq: ja, der muss irgendwo her kommen, wo du weißt, dass der speicher grade für dich legal beschreibbar ist
14:49:01 CubeCoder: ah okay
14:49:09 CubeCoder: jetzt funktionierts
14:49:39 xq: auch verstanden, was das problem war?
14:49:59 CubeCoder: joa aber dann versteh ich das nicht:
14:50:23 CubeCoder: wieso darf ich das machen: https://hastebin.de/ajanumudon.rust
14:50:32 CubeCoder: aber nicht das was ich oben hatte?
14:51:47 xq: char * ptr;
14:51:51 xq: das ist erst mal nur ein pointer
14:52:07 xq: ptr = ""; // das hier lässt den pointer dann irgendwo hin zeigen, wo ein byte "0" liegt
14:52:15 xq: dieses darfst du nicht beschreiben
14:52:18 CubeCoder: ja zu einer adresse im speicher oder?
14:52:31 xq: genau
14:52:34 CubeCoder: okay
14:52:37 xq: und diese "gehört" nicht dir
14:52:40 CubeCoder: ja
14:52:47 xq: darum darfst du da auch nicht reinschreiben
14:53:02 xq: (eigentlich sollten string literals const sein, aber C ist da ... komisch)
14:53:08 CubeCoder: okay
14:53:47 xq: sprich:;
14:53:56 xq: char * ptr = ""; // zeigt jetzt auf ein byte, aber du darfst nicht reinschreiben
14:54:14 xq: du weißt vorallem auch nicht, ob nach diesem byte noch mehr speicher ist, der zum string gehört (antwort: tut er nicht)
14:54:36 xq: das heißt, wenn du da rein schreibst, kann es sein, dass *alle* ("") in deinem programm plötzlich deinen text enthalten
14:54:56 CubeCoder: okay...
14:55:30 xq: klar?
14:55:33 xq: oder noch nicht?
14:56:42 CubeCoder: ja klar also muss man wenn man einen string erstellt dem ne länge geben damit man nicht in andere strings oder insgesamt anderem speicher reinschreibt
14:57:03 xq: genau
14:57:20 xq: auf nem "Hosted" environment geht das mit malloc() für dynamische längen
14:57:29 xq: (hosted heißt: mit OS/libc drunter)
14:57:39 xq: was immer geht: ein char-array nehmen und beschreiben
14:57:42 CubeCoder: und bei der funktion oben wird dann der speicher von dem char benutzt damit der string "erweitert" wird oder wie?
14:57:59 CubeCoder: okay
14:58:47 xq: ne, in deiner funktion wird erst mal nru der speicher benutzt, der da reingegeben wird
14:58:53 xq: woher der kommt, ist da überhaupt nicht gesagt
15:11:34 CubeCoder: okay also wenn der reingegebene speicher zu klein wäre würde das auch nicht mehr funktionieren?
15:13:38 xq: exakt
15:13:41 xq: das explodiert dann genauso
15:13:53 xq: das wäre ein ganz klassischer fall von buffer overrun
15:13:57 xq: beispiel:
15:14:22 xq: void foo() { char str[10]; strcpy(str, "user: "); strcat(str, user_name); return; }
15:14:39 xq: wenn user_name hier zu lange ist, kannst du damit die return-adresse der funktion ändern
15:15:31 CubeCoder: nice
15:16:35 xq: nein :D
15:16:42 CubeCoder: doch xD
15:16:44 xq: sowas kostet im zweifel leben, wenn man das in der software hat
15:17:20 CubeCoder: ach das ist doch nicht so wichtig
15:17:33 CubeCoder: sprüht das dann auch funken wenn das passiert?
15:18:18 xq: https://de.wikipedia.org/wiki/Liste_von_Programmfehlerbeispielen#Medizin
15:18:39 xq: kommt drauf an, ob das Flak grade auf fahrzeuge oder auf menschen zielt
15:18:40 CubeCoder: uff
15:19:20 xq: so ein bug wie oben ist mit leichtigkeit "wormable"
15:19:36 xq: weil ein "user" (also eine externe einheit) die möglichkeit hat, code auszuführen
15:19:52 xq: was dann dazu führt, dass man computer fernsteuern kann und damit dementsprechend fiesen schaden anrichten
15:20:00 CubeCoder: ja ist doch schön so ein wurm
15:20:16 xq: Y2K: Es kam weltweit zu Fehlfunktionen in Kernkraftwerken.[29][30]
15:20:56 CubeCoder: deswegen lebe ich nicht in der nähe von solchen dingern xDD
15:21:07 xq: das bringt dir nix, du lebst nah genug an denen ;)
15:21:30 CubeCoder: uff
15:22:08 xq: Sobald Software mit realer Welt in Berührung kommt, wirds gefährlich
15:22:17 CubeCoder: ja
15:22:36 xq: und das ist relativ schnell erreicht
15:22:45 xq: aber: safety ist eine sache (schaden an leib und leben)
15:22:50 xq: security eine andere
15:23:04 xq: (schaden an system und daten)
15:24:57 xq: schluderig arbeiten lohnt sich eigentlich nicht
15:25:11 xq: ich hab jetzt fast 3 Monate Zeit "verloren", weil ich geschludert hatte
15:25:22 CubeCoder: nice
15:25:36 kevin: Das Problem ist, in den ersten fünf Minuten lohnt es sich doch
15:30:03 xq: jo, und danach nicht mehr
16:35:40 LittleFox: immer mal das programm in valgrind ausführen, das zeigt dir solche fehler an
16:36:08 LittleFox: was natürlich nur auf hosted environments geht
16:36:43 LittleFox: deswegen empfiehlt es sich lowlevel code und code er sowohl lowlevel als auch hosted laufen könnte zu trennen, dass du den hosted testen kannst und dann weißt dass der funktioniert
16:43:39 kevin: Aber besser nicht auf Valgrind verlassen, sondern solche Fehler erst gar nicht machen...
16:43:52 kevin: Wenn Valgrind was anzeigt, ist wahrscheinlich was kaputt, aber wenn es nichts anzeigt, ist das nur keine Aussage
16:45:09 LittleFox: jap
16:45:31 LittleFox: aber es fängt die ganzen kleinen bugs erstmal ab und hilft damit schon enorm x)
16:45:42 LittleFox: wobei ich es ja gestern auch ausgetrickst habe
16:46:00 LittleFox: "bis auf 24 byte [die ok sind] wurde alles free()'d"
16:46:21 LittleFox: joar ... bis auf die eine 2MB huge page und die eine 1GB huge page die ich mit mmap allocated habe :D
18:57:15 Paddy joined the channel