c++ vs. java... was hat zukunft
-
Artchi schrieb:
Gregor schrieb:
phlox81 schrieb:
Zum Thema "Java ist sicherer":
http://www.heise.de/newsticker/meldung/89821"Java ist sicherer" ist wie folgt zu verstehen: In Java gibt es Sicherheitskonzepte. Natürlich haben die auch Lücken (Die JVM ist schließlich in C++ geschrieben). In C++ gibt es aber erst gar keine.
In C++ ist dafür das OS zuständig. Z.B. sollte ein OS ein C++-Programm daran hindern, in das OS-Verzeichnis zu schreiben. Oder ebend über Speicherschutz ein Programm zu hindern, auf fremde Speicherbereiche zu zugreifen. Und wer will, kann auch virtualisieren, was einer JVM ähnlich kommt. (mehrere JVM-Instanzen unter Windows
mehrere VirtualPC-Instanzen... als Beispiel) Das was unter Java die VM macht, macht unter C++ das Betriebssystem. Am Ende ist das Verfahren das gleiche: irgendeiner kontrolliert das Programm. Und wenn eine JVM eine Lücke hat, kann das auch ein OS haben. Die Sicherheit ist nur so gut, wie ihr Kontrolleur.
Meinst Du, die Sicherheitslücke, die da in dem Artikel genannt wurde, hat Ihren Ursprung im Java-Code der Standardbibliothek? Ich denke ja eher, dass man da im C++-Code suchen müsste, der in der JVM ist oder über JNI genutzt wird. Also: Warum schützt das Betriebssystem da nicht?
-
@Gregor
die meisten Betriebssysteme und die meiste Hardware überwacht eben die Prozesse nicht. Das heißt aber nicht das man dafür eine VM braucht. Man siehe zB ADA. Dort gibt es einen sehr hohen Schutz und das ohne eine VM.
-
Es geht ja auch garnicht darum, dass es anders nicht geht, sondern dass der Schutz bei Java halt da ist und bei C++ bei ner typischen Umgebung eben nicht. Das ist doch eigentlich ein ganz klarer Punkt!?
-
Artchi schrieb:
Sehr witzig! Das Programm wird am Ende in Maschinencode ausgeführt. Kann auch Assembler sein. Und stell dir vor: auch Assembler-Programme unterliegen der Kontrolle des OS. Muss ich dir aber eigentlich nicht erklären, da ich mir denke, das du sowas als C-Programmierer weißt und nur stänkern willst.
weiss ich auch.
ich wollte dir nur zeigen, wie peinlich dein versuch war, dem hund ein weiteres bein anzunageln, das ihm noch nicht mal gehört.Artchi schrieb:
Du weißt aber genau was ich mit C++-Programm gemeint habe.
ja, den begriff 'C++' hättest du in deinem beitrag auch ganz weglassen können
-
rüdiger schrieb:
Man siehe zB ADA. Dort gibt es einen sehr hohen Schutz und das ohne eine VM.
naja, 'ne ariane hat's trotzdem zerrissen, obwohl ada verwendet wurde.
aber bitte nicht falsch verstehen: ada ist schon was feines
-
c++ is an insult to the human brain
-
pale dog schrieb:
rüdiger schrieb:
Man siehe zB ADA. Dort gibt es einen sehr hohen Schutz und das ohne eine VM.
naja, 'ne ariane hat's trotzdem zerrissen, obwohl ada verwendet wurde.
aber bitte nicht falsch verstehen: ada ist schon was feinesWenn man W. Kahan glauben darf, dann ist die Striktheit sogar Schuld an dem Desaster. ADA behandelt nämlich Overflows als Exception (bzw. im IEEE754-Sinn als Trap) und nicht als Exception im IEEE754-Sinn (also nur eine Signalisierung des Fehlers).
http://www.cs.berkeley.edu/~ejr/Projects/ieee754/meeting-minutes/02-07-18.html#formal
-
Hier mal eine andere Meinung zu IEEE754:
-
rüdiger schrieb:
Wenn man W. Kahan glauben darf, dann ist die Striktheit sogar Schuld an dem Desaster. ADA behandelt nämlich Overflows als Exception (bzw. im IEEE754-Sinn als Trap) und nicht als Exception im IEEE754-Sinn (also nur eine Signalisierung des Fehlers).
http://www.cs.berkeley.edu/~ejr/Projects/ieee754/meeting-minutes/02-07-18.html#formal
habe da eine andere quelle gefunden die es etwas näher beschreibt...
Ziel war es, die Systemauslastung des SRI-Computers auf 80% zu halten.
Deswegen hat man auch nicht alle Variablen auf einen Überlauf überprüft. Um
eventuelle Probleme bei dem ungeschützten Code auszuschließen, wurde eine
Analyse für jede Variable, die eine Exception verursachen könnte, durchgeführt.
Die Gefahr eines Überlaufs bestand bei sieben Variablen, dabei wurden vier
geschützt, während drei ungeschützt blieben. Bei den drei ungeschützten
Variablen meinte man, dass sie entweder physikalisch limitiert waren und
deswegen keinen Überlauf verursachen konnten, oder man hatte einen großen
Sicherheitsspielraum gelassen, so dass die Werte die obere Grenze nie erreichen
konnten. Jedoch wurden für die Analyse keine Flugdaten der Ariane 5
verwendet, sondern ging von Werten der Ariane 4 aus. Es sollte auch erwähnt
werden, dass die Entscheidung einige Variablen nicht zu schützen in
Übereinstimmung mit den Projektpartnern in mehreren Verträgen erfolgte.http://www4.in.tum.de/lehre/seminare/ps/WS0203/desaster/Riedl-Arianne5-Ausarbeitung-27-11-02.pdf
-
Gregor schrieb:
Hier mal eine andere Meinung zu IEEE754:
Hier ist die Darstellung von Kahan http://www.cs.berkeley.edu/~wkahan/ieee754status/754story.html
naja, ich weiß nicht was stimmt und wie schlecht/gut IEEE754 ist (mache eh nur sehr selten etwas mit Floatingpoint-Arithmetik). Aber immerhin hat der Kahan dafür einen Turing Award bekommen.
-
rüdiger schrieb:
Aber immerhin hat der Kahan dafür einen Turing Award bekommen.
Ob Stroustrup auch einen kriegt?
...schließlich hat der auch nen tollen Standard initiiert.
-
Gregor schrieb:
Meinst Du, die Sicherheitslücke, die da in dem Artikel genannt wurde, hat Ihren Ursprung im Java-Code der Standardbibliothek? Ich denke ja eher, dass man da im C++-Code suchen müsste, der in der JVM ist oder über JNI genutzt wird. Also: Warum schützt das Betriebssystem da nicht?
das OS schützt davor, z.B. das OS-Verzeichnis zu löschen. Ein ganz triviales Beispiel. Und kann der genannte Bug z.B. unter Windows im normalen Benutzer-Modus das OS-Verzeichnis o.a. wichtige Systemeeinheiten kaputt machen? Nein, er kann nur im Userkontext handeln.
Der Bufferoverflow ist erstmal nebensächlich, da der Sicherheitskontext des OS schützt. Der Schadcode kann nur im Userkontext handeln. Oder siehst du das anders?
Ich kann auch in Java das komplette Userhome-Verzeichnis boshaft löschen, ohne das der User es mitbekommt. Die JVM erlaubt das Userhome-Verz. zu löschen, weil das der Userkontext des OS erlaubt. Ist also nicht viel anders als ein natives Programm ohne VM.
Natürlich kann im Java-Bytecode auf der JVM kein Bufferoverflow passieren. Aber das hat dann nichts direkt mit Java als Sprache zu tun. Ich kann auch Jython, JRuby u.a. Sprachen auf der JVM benutzen. Oder müssen diese Sprachen ihr eigenen Bufferoverflow-Check oder andere Sicherheitsmassnamhem "mitbringen"? Ich denke nicht. Letztendlich kontrolliert die JVM und nicht die Java-Sprache böse Aktionen. Oder?
Für diese Schutzmechanismen muß erstmal die JVM sorgen können! Wer sagt denn, das Java-Byte-Code auf einer JVM mit Bufferoverlow-Kontrolle laufen muß? (außer über die SUN-Zertifizierung, dann gibts erst ein Java-Siegel, ich weiß) Ich kann eine schlechte oder abgespeckte JVM programmieren und das Ding in produktiven Einsatz bringen. Wenn mir das jemand "abkauft", kann jedes Java-Programm Mist anstellen. Da hilft mir Java-Code nichts, wenn meine gebastelte JVM keine Runtime-Checks auf den Java-Bytecode macht. Im schlimmsten Fall kann ich mit einer rekursiven Funktion das Systemverzeichnis des PCs mit Java-Code löschen, wenn der User im Admin-Modus die JVM laufen lässt. Kann er bestimmt sogar mit der SUN JVM... habs aber nie ausprobiert.
Wenn wir also über Bufferoverflow-Kontrolle u.a. Schutzmechanismen reden, dann bitte auf Runtime-/OS-Ebene. Und da gibt es bei den C++-Compilern und C++-Runtimes sehr wohl Bufferoverflow-Mechanismen. Sowohl die Secure-C-Library, die von MS sogar per Compiler-Warnings dem Programmierer darauf hinweist, wenn man sie nicht nutzt. Als auch per Compiler-Schalter, der Bufferoverflow-Jumps mit Laufzeit-Checks überprüft (ohne das ich meinen Code anpassen muß). Die muß man zwar erstmal einschalten, aber man kann sie einschalten. Und dann fliegt eine Exception mit aussagefähigem Fehlerdialog bei einem Bufferoverflow und die C/C++-Runtime bricht das Programm wegen einem Bufferoverflow-Vergehen ab.
Das Sun hier wahrscheinlich eine 10 Jahre alte JPEG-C-Library benutzt, zeigt nur, das sie ihre Runtime (egal ob auf Bytecode- oder Maschinencode-Ebene) vernachlässigt haben. Ich habe mal in einem Java 1.4-Memorydump (oder war es doch 1.5?) unserer produktiven Java-Anwendung einen MSVC6-Logeintrag gesehen. Hallo??? Warum benutzen die nicht den MSVC7.1 und schalten den Bufferoverflow-Checker per Compilerschalter oder schreiben die JPEG-Lib auf Secure-C-Library-Funktionen um? Der MSVC8.0 zeigt nervig die Warnings an den passenden Stellen auf. Das zeugt nur von Ignoranz von Seiten SUN.
Meine Kernaussage bleibt aber erstmal: das OS/Virtualisierung schützt erstmal selbst wichtige Systemeinheiten vor Schadcode. Kann das OS dieses nicht leisten, scheint auch die Umgebung nicht kritisch zu sein. Weiterhin kann der Compiler Runtime-Checks per Compilerschalter einbringen (was nicht praxisfern ist, sondern von MSVC angeboten wird).
-
omh
-
pale dog schrieb:
Simon2 schrieb:
pale dog schrieb:
...
ja, flache kopien, das konnte C ohne ++ schon mit structs machen, als struppi noch die wolle aus'm teddybär'n gezupft hat.
Naja, ein bischen mehr schon. Immerhin werden auch selbstgeschriebene CopyCtoren von tief verschachtelten Klassen aufgerufen ...
...die man aber erst schreiben muss und die für jede klasse anders aussehen.
...Du hast mich mißverstanden: Wenn ICH für meine Klasse keinen speziellen CopyCtor brauche, reicht der implizite auch dann, wenn irgendeine verschachtelte Klasse (irgendwo unten in der Vererbungshierarchie - von irgendjemand anders vor Jahren geschrieben) einen selbstgeschriebenen hat.
Das ist schon ein wenig mehr als mit C-Structs möglich war."Nicht vergessen können" bedeutet: Ich schreibe einfach jedesmal (unabhängig vom Typen)
TYP a; TYP b = a;
und brauche nicht nachzuschlagen, ob ich jetzt eina.CopyMeHappily()
oder eina.CloneMyButt()
aufrufen muss.Aber wie gesagt: Kein wirklicher "Kriegsentscheider"....
Gruß,
Simon2.
-
Simon2 schrieb:
Wenn ICH für meine Klasse keinen speziellen CopyCtor brauche, reicht der implizite auch dann, wenn irgendeine verschachtelte Klasse (irgendwo unten in der Vererbungshierarchie - von irgendjemand anders vor Jahren geschrieben) einen selbstgeschriebenen hat.
Das ist schon ein wenig mehr als mit C-Structs möglich war.nö, das ist exakt das gleiche was C macht. wenn du in C eine struct hast, die ihrerseit wieder structs beinhaltet, dann wird mit '=' eine bitweise kopie erzeugt. beispiel:
struct a { int ma; }; struct b { int mb; struct a a; }; ... struct b b1 = {123, 456}; struct b b2; ... b2 = b1; // b2 hat danach: mb==123 und a.ma==456 ...
C kann zwar keine vererbung, aber aggregation (bzw. verschachtelte objekte)
und das beispiel macht eben eine flache kopie, da bietet C++ nix neues.
ok, in c++ könnte man's noch mit den default copy-ctor machen: b b2(b1);
aber der macht ja das selbe, ausser dass der überflüssige aufruf des standard-konstruktors (nehme ich an) dann nicht passiert.
bemerkenswert (oder bedenklich) bei C++ ist dabei allerdings, dass das default-verhalten von '=' und das des copy-ctors verändert werden können, ohne dass der anwender der klasse davon kenntnis hat (aber zu dem thema hatten wir ja schon einen thread)
-
@pale dog:
Mir fällt auf dass Du mit C++ wohl nicht wirklich zufrieden bist.
Hast Du Dich eigentlich schon mal mit Python beschäftigt?
zu der Sprache würde mich mal Deine Meinung interessieren!Grüsse
*this
-
Gast++ schrieb:
@pale dog:
Hast Du Dich eigentlich schon mal mit Python beschäftigt?
zu der Sprache würde mich mal Deine Meinung interessieren!nein, leider hatte ich noch keine gelegenheit dazu.
...aber ich hab' ausschliesslich positives darüber gehört.
-
pale dog schrieb:
...
nö, das ist exakt das gleiche was C macht. wenn du in C eine struct hast, die ihrerseit wieder structs beinhaltet, dann wird mit '=' eine bitweise kopie erzeugt. ...Sag mal - Du kannst mich doch verstehen - warum tust Du denn nicht ?
C kann eben in "impliziten CopyCtoren" NUR "implizite CopyCtoren" (=flache Kopien) aufrufen (weil es eben keine anderen kennt). C++ dagegen kann in "impliziten CopyCtoren" AUCH "explizite CopyCtoren" aufrufen.
Dieses "AUCH" ist das Quentchen Mehr, das ich meine.
Ja - C++ kann keine impliziten CopyCtoren für "tiefe Kopien" erzeugen, aber sie können eben dieses bischen mehr, so dass ich eine "ausreichend tiefe Kopie" bekomme (wenn mir für meine Klasse eine "flache" reicht, kann ich trotzdem implizit eine "tiefe" für meine Attribute/Basisklassen bekommen, wenn die das brauchen).Übrigens sind "tiefe Kopien" nicht der einzige Grund für einen eigenen CopyCtor ... ud spätestens da ist C am Ende.
Gruß,
Simon2.
-
Simon2 schrieb:
C kann eben in "impliziten CopyCtoren" NUR "implizite CopyCtoren" (=flache Kopien) aufrufen (weil es eben keine anderen kennt).
unsinn, C kennt überhaupt keine konstruktoren.
Simon2 schrieb:
C++ dagegen kann in "impliziten CopyCtoren" AUCH "explizite CopyCtoren" aufrufen.
Dieses "AUCH" ist das Quentchen Mehr, das ich meine.dass C++ mehr möglichkeiten bietet als C will keiner bestreiten. ob alles davon wirklich sinnvoll und nützlich ist, ist natürlich ein anderes thema.
Simon2 schrieb:
Übrigens sind "tiefe Kopien" nicht der einzige Grund für einen eigenen CopyCtor ... und spätestens da ist C am Ende.
ich hatte vor ein paar postings C erwähnt, weil CStoll 'implizite copy-ctors' als ein tolles C++ feature angepriesen hast, aber C die gleiche funktionalität für structs schon seit urzeiten hat - auch ganz ohne konstruktoren.
ein vergleich (oder flamewar) C gegen C++ wäre genau so absurd wie C++ gegen Java.
gleichberechtigte flamewar-kontrahenten wären z.b. C# vs. Java oder etwa C vs. Pascal.
C++ kann man, meiner meinung nach, schlecht mit anderen sprachen vergleichen, weil es so'n schlüpfriges zwitterding und deshalb einzigartig ist.
... und wenn man's doch macht, kommen die seltsamsten argumente (wie etwas dass das OS für C++'s sicherheit zuständig ist. so ein quatsch!).
-
OK, da hilft nur, Dein Gedächtnis auffrischen:
pale dog schrieb:
Simon2 schrieb:
C kann eben in "impliziten CopyCtoren" NUR "implizite CopyCtoren" (=flache Kopien) aufrufen (weil es eben keine anderen kennt).
unsinn, C kennt überhaupt keine konstruktoren....
Erstaunlich - ich hätte Dir die Transferleistung zugetraut - sag nicht, dass ich mich getäuscht habe....
pale dog schrieb:
...
Simon2 schrieb:
Übrigens sind "tiefe Kopien" nicht der einzige Grund für einen eigenen CopyCtor ... und spätestens da ist C am Ende.
ich hatte vor ein paar postings C erwähnt, weil du 'implizite copy-ctors' als ein tolles C++ feature angepriesen hast, ...
Zur Erinerung:
Simon2 schrieb:
pale dog schrieb:
...
CStoll schrieb:
In C++ kannst du (fast) jedes Objekt von Haus aus kopieren.
ja, flache kopien, das konnte C ohne ++ schon mit structs machen, als struppi noch die wolle aus'm teddybär'n gezupft hat.
Naja, ein bischen mehr schon. ...Letztlich finde ich den Unterschied aber eher marginal ...
Simon2 schrieb:
...können eben dieses bischen mehr, ...
Merke: "Bischen", "marginal", "bischen"
Irgendwie bringe ich das nicht mit Deinem "... tolles C++ feature angepriesen ..." in Einklang und ebensowenig mit einem "flamewar", wie Du ihn herufziehen siehst...Gruß,
Simon2.