Habt ihr eine Laufzeitumgebung (VM/.Net) installiert?
-
Optimizer schrieb:
Nein, das hab ich nicht erfunden. Freilich kann der Programmierer *wenn er dran denkt* das verhindern. Aber offenbar kommt es ja oft genug vor, dass er nicht daran denkt.
Es geht nicht um's Denken. Es geht darum, daß Buffer Overflows Anfänger- oder Leichtsinnsfehler sind, die maschinell gefunden werden können. Es besteht nur ganz offensichtlich kein Bedarf daran. So what?
Stichwort Buffer Overflow
Nein. "Es gibt Pufferüberläufe, weil es Pufferüberläufe gibt", ist noch nichtmal im Grundkurs Deutsch als Argument zu bezeichnen. Außerdem ist Speichermanagement wesentlich differenzierter. Java oder C# sind per se auch nicht für sicherheitskritische Anwendungen zu gebrauchen, wie man in den einschlägigen Normen nachschlagen kann.
-
Optimizer schrieb:
void foo(int[][] array) { } void foo(int[] array) { for (int i = 0; i < array.length; ++i) array[i] = i%865 * 874356; }Das finde ich echt godlike.
Was, dass man array.length schreiben kann?
Für mich sieht diese Schleife genauso potthässlich aus, wie in C/C++.
-
Gut, dass man in C++ nicht mehr weiss, was es ist, wenn man ein int* bekommt (es muss nichtmal ein Array sein). Oder umgekehrt, die Funktion kann nicht verlangen, ein Array zu bekommen und ist auch noch darauf angewiesen, dass es die korrekte Länge auch noch kriegt.
Beispiel aus der Praxis:
D3DXVECTOR2 temp[5] = { D3DXVECTOR2(drawX, drawY), D3DXVECTOR2(drawX + width, drawY), D3DXVECTOR2(drawX + width, drawY + height), D3DXVECTOR2(drawX, drawY + height), D3DXVECTOR2(drawX, drawY) }; lpLine->Draw(temp, 5, 0xFFFFFFFF);// C# Vector2[] temp = new Vector2[] { new Vector2(40, 60), new Vector2(700, 90), new Vector2(200, 400), new Vector2(800, 300) }; line.Draw(temp, Color.FromArgb(200, 100, 0));Aber gut, es haut dich nicht vom Hocker, aber mir gefällt sowas.
-
Optimizer schrieb:
Gut, dass man in C++ nicht mehr weiss, was es ist, wenn man ein int* bekommt (es muss nichtmal ein Array sein). Oder umgekehrt, die Funktion kann nicht verlangen, ein Array zu bekommen und ist auch noch darauf angewiesen, dass es die korrekte Länge auch noch kriegt.
äh, ja.. Fällt aber in die selbe Kategorie, wie die Indexüberschreitungen. Wenn ich eine Funktion schreibe, gehe ich davon aus, dass die Argumente richtig übergeben wurden. Und wenn ich sie aufrufe achte ich darauf, das dem so ist.
Naja, ich will nicht gegen Typsicherheit argumentieren. Aber das sind echt keine Fehler die einem das Leben schwer machen. Und eine dicke VM hilft dagegen eh nicht.
Beispiel aus der Praxis:
D3DXVECTOR2 temp[5] = { D3DXVECTOR2(drawX, drawY), D3DXVECTOR2(drawX + width, drawY), D3DXVECTOR2(drawX + width, drawY + height), D3DXVECTOR2(drawX, drawY + height), D3DXVECTOR2(drawX, drawY) }; lpLine->Draw(temp, 5, 0xFFFFFFFF);Beispiel aus deiner Praxis... Kann ja keiner was für, wenn du so'ne Krückenlibs verwendest. In C++ gibts doch auch Klassen.
-
DrGreenthumb schrieb:
Wenn ich eine Funktion schreibe, gehe ich davon aus, dass die Argumente richtig übergeben wurden.
Sorry, aber das ist ein grober Fehler. Wenn du so argumentierst, dann braucht man asserts und Exceptions auch nicht.
DrGreenthumb schrieb:
Naja, ich will nicht gegen Typsicherheit argumentieren. Aber das sind echt keine Fehler die einem das Leben schwer machen.
Aber sowas macht einem das Leben leicht.
btw., diese "Krückenlib" nennt sich Direct3D und D3DXVECTOR2 ist auch eine Klasse, sowohl in C# als auch in C++. Aber das Array ist in C++ keine Klasse. Ich kann der Funktion jetzt aber kein std::vector übergeben.
Ok, wie auch immer, ich streite nicht ab, dass man mit C++ alles genauso sicher machen kann, wie mit C# oder Java. Aber diese Sprachen sind halt von Haus aus typensicher. Ich kann mir natürlich selber für jede DX-Funktion nochmal nen Wrapper schreiben, damit ich statt einem Pointer einen std::vector übergeben kann. -> Produktivität.
-
hab auch 'ne GTK Laufzeitumgebung

-
Optimizer schrieb:
DrGreenthumb schrieb:
Wenn ich eine Funktion schreibe, gehe ich davon aus, dass die Argumente richtig übergeben wurden.
Sorry, aber das ist ein grober Fehler. Wenn du so argumentierst, dann braucht man asserts und Exceptions auch nicht.
Exceptions sind für was ganz anderes da und asserts braucht man eigentlich wirklich nicht, stimmt.
DrGreenthumb schrieb:
Naja, ich will nicht gegen Typsicherheit argumentieren. Aber das sind echt keine Fehler die einem das Leben schwer machen.
Aber sowas macht einem das Leben leicht.
Naja, ich spreche immer nur von meiner Erfahrung und dort hab ich wirklich nie mit solchen Problemen zu tun. Wenn man sich dann wirklich mal irgendwo vertippt oder geistig nicht ganz anwesend ist, ist das Problem auch innerhalb kürzester Zeit lokalisiert.
btw., diese "Krückenlib" nennt sich Direct3D und D3DXVECTOR2 ist auch eine Klasse, sowohl in C# als auch in C++. Aber das Array ist in C++ keine Klasse. Ich kann der Funktion jetzt aber kein std::vector übergeben.
[...]
Ich kann mir natürlich selber für jede DX-Funktion nochmal nen Wrapper schreiben, damit ich statt einem Pointer einen std::vector übergeben kann. -> Produktivität.Ja, also Krückenlib. Sag ich ja.
Aber das sehe ich genauso und deshalb hab ich's auch vorläufig aufgegeben mit C++ zu programmieren, weils jedesmal darin ausgeartet ist, dass ich einen Wrapper nach dem anderen schreibe.Aber ist jetzt eher Offtopic. Wie schon gesagt, ich brauche kein VM für eine eingebaute Array-Klasse...
-
Wofür sind Exceptions deiner Meinung nach da?
Also meiner Meinung nach sind sie dafür da, wenn jemand (ein böser Mensch halt) deine Klasse falsch benutzt, ihn- keinen falschen/ungültigen/sinnlosen Wert (evtl. "Fluchtwert") zurückzugeben, was einen schwer auffindbaren logischen Fehler verursachen könnte, wenn dieser Wert einfach trotzdem verwendet wird oder nicht abgefragt wird
- dazu zu zwingen, sich mit der Situation auseinanderzusetzen
- das Problem an den eigentlichen Verursacher zurückzuwerfenEigentlich wollte ich dir nur sagen, dass ich es für unklug halte, davon auszugehen, dass eine Funktion immer richtig aufgerufen wird. Das kannst du vielleicht noch in deiner eigenen Klasse bei privaten Methoden annehmen.
Aber jetzt sind wir wirklich Offtopic.

P.S. Ich sag ja nicht, dass man ne VM wegen den Arrays braucht, aber z.B. garbage collecting möchte ich wirklich nicht mehr missen.
Zur Umfrage: Ich finde es doch interressant, dass .Net noch relativ wenig Unterstützung erfährt (halb so viel wie die JVM), obwohl doch M$ eigentlich in der weit günstigeren Position ist, sein Framework unter Windows durchzusetzen.
-
Optimizer schrieb:
Wofür sind Exceptions deiner Meinung nach da?
Also meiner Meinung nach sind sie dafür da, wenn jemand (ein böser Mensch halt) deine Klasse falsch benutzt, ihnExceptions werfe ich bei Laufzeitfehlern, die die Umgebung verursacht hat. zB. nicht gefundene Dateien, getrennte Netzwerkverbindungen etc. Vom Programmierer kann man doch aber verlangen, dass er sich an die Anforderungen hält, die die Funktion verlangt. Macht den Code einfacher und spart Laufzeit.
-
Was hat eigentlich Garbage Collection mit VM zu tun? Was hat eigentlich überhaupt irgendein Pro-Java-Argument, was in diesem Thread gefallen ist, mit der VM zu tun?
-
DrGreenthumb schrieb:
Vom Programmierer kann man doch aber verlangen, dass er sich an die Anforderungen hält, die die Funktion verlangt. Macht den Code einfacher und spart Laufzeit.
Dazu sind asserts da. Wenn ich assert(p >= 0); schreibe, heißt das für mich, «ich gehe davon aus, dass an dieser Stelle p größer gleich 0 ist.»
-
asserts sind IMHO immer nützlich, da sie erstens keinen Laufzeit Overhead erzeugen (werden ja im Release ausgeschaltet) und einem extrem das leben erleichtern können (es ist schon eindeutiger, wenn ein Fehler gemeldet wird wie "assert x<0 failed" anstelle "SegMentation fault in ??".
-
Bashar schrieb:
Was hat eigentlich Garbage Collection mit VM zu tun? Was hat eigentlich überhaupt irgendein Pro-Java-Argument, was in diesem Thread gefallen ist, mit der VM zu tun?
Weiß ich nicht, was ist eigentlich eine VM? Ich dachte, dass ist das was im Hintergrund läuft, Garbage collectiert und zur Laufzeit aufpasst, dass keine Indexüberschreitungen oder sonstiges stattfinden.
Dazu sind asserts da. Wenn ich assert(p >= 0); schreibe, heißt das für mich, «ich gehe davon aus, dass an dieser Stelle p größer gleich 0 ist.»
Ja, ich weiß. Und wenn ich bei einer Funktion sicherstellen will, dass x in einem bestimmten Bereich liegt, macht es auch sinn. Aber ich überprüfe doch nicht jeden Pointer ob er auch nicht null ist, oder so. Bei vielen Dingen gehe ich einfach davon aus, dass das Argument den Anforderungen gerecht wird.
-
GC oder Indexprüfung gibt es auch ohne VM (Lisp, Eiffel, SML, ...) Der Managed-Aspekt einer VM erstreckt sich auf Sicherheit im Binärcode, d.h. selbst ein JVM-"Assembler"-Programm kann keine Arraygrenzen überschreiten (jedenfalls soweit ich das verstanden habe.)
Bei vielen Dingen gehe ich einfach davon aus, dass das Argument den Anforderungen gerecht wird.
Das assert drückt genau das aus, dass du davon ausgehst. Liegst du mal falsch, wird dir das gesagt. Compilierst du mit -D_NDEBUG, werden alle assertions deaktiviert.
-
Der Managed-Aspekt einer VM erstreckt sich auf Sicherheit im Binärcode, d.h. selbst ein JVM-"Assembler"-Programm kann keine Arraygrenzen überschreiten (jedenfalls soweit ich das verstanden habe.)
so etwas gibt es aber auch für C und C++. OpenBSD und Trusted Debian setzen AFAIK etwas derartiges ein, um das System besser gegen Bufferoverflows zu schützen.
-
Quelle? Ich vermute, das ist etwas, das dem Stack die Ausführungsrechte nimmt, so dass man Buffer-Overflows nicht zum Einsteigen exploiten kann.
-
Ich weiß nicht ob das gemeint war:
http://kerneltrap.org/node/view/573
-
-
Sag ich ja. Die verhindern keine Array-Überläufe, sondern nur einige der sicherheitsrelevanten Auswirkungen.
-
Wenn ich eine Funktion schreibe, gehe ich davon aus, dass die Argumente richtig übergeben wurden.
Das ist dein Fehler.
Vom Programmierer kann man doch aber verlangen, dass er sich an die Anforderungen hält, die die Funktion verlangt.
Wieso sollte ich irgendetwas Vermuten, wenn ich es doch problemlos sicherstellen kann und das mit geringem Aufwand.
------------------------------------------
Ich habe Sun's VM 1.4.3, verwende Javaanwendungen und habe auch schon welche geschrieben. Ich habe Privat kein .Net-Framework, nicht-privat hingegen schon, weil ich an einem Projekt arbeite, welches in .Net entwickelt wird.