Original von klausel
Das war genau die Frage. malloc nullt nix. new könnte ja ein schlauer Wrapper für malloc sein, der direkt alles nullt.
1) PODs haben keinen DefaultConstuctor
2) Sonst werden PODs auch nicht genullt, warum auf einmal bei new?
Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen
Original von klausel
Das war genau die Frage. malloc nullt nix. new könnte ja ein schlauer Wrapper für malloc sein, der direkt alles nullt.
Original von tjp
Wie gesagt, wenn man es unbedingt braucht kann man es einbauen. Nur diesen Aufwand für PODs zu betreiben ist etwas übertrieben. Ich sehe persönlich auch keine Grund warum auf einmal new PODs nullen sollte. Sonst werden PODs auch nicht genullt. Warum dann auf einmal dieses abweichende Verhalten haben wollen?
Original von tjp
Meist nutzt man new auf PODs um Speicher für irgend was zu allozieren und schreibt anschließend gleich Daten rein. Warum den Job gleich zweimal machen?
Original von Tom9811
Ich kann auch kein Problem erkennen, wie 0 interpretiert wird. Dann mag es anders interpretiert werden. Es wird indessn *definiert* interpretiert, egal ob 0x0 nun 0 oder Damenuntrwäsche bedeutet.
Original von Tom9811
Also, abgesehen davon, dass Klaus sicherlich dafür wäre, dass jede Instanz (also auch skalare) genullt wird (das unterstelle ich jetzt mal),
rechtfertigt sich das abweichende Verhalten daraus, dass es in der Wildnis nuneinmal ganz enorm viele Probleme mit Arrays gibt.
Du musst das dann natürlich für jede Klasse ändern, was nicht unerheblich Aufwand ist.
Eine Alternative wäre eine Kategorie von NSObject. Dann hat man die Arbeit nur einmal …
Das ist in der Tat kein Problem, doch es hilft Dir (bis auf beim debuggen) auch nicht weiter. Du kannst im Programm mit einem Test, ob ein Element gleich "0" ist nämlich nicht erkennen, ob auch eine binäre 0 dahinter steht, also Dein Element noch nicht anderweitig initialisiert wurde.
eine sehr gewagte These...
Uninitialisierte Variablen sind ein klassischer Angriffsvektor. Auch hierzu wird dir Klaus sicherlich einiges erzählen können. Der wesentliche Angriff beruht darauf, dass du etwa durch einen Bufferoverflow an anderer Stelle die Variable selbst "initialisierst", etwa eine lokale Variable.Diese Probleme haben aber nicht viel damit zu tun, ob der Speicher genullt wird, oder nicht.
kmr schrieb:
Ach, Du bist auch so ein leichtgläubiger Zeitgenosse, der alles glaubt, was irgendwelche Typen vor sich hin brabbeln. :-P
Original von Tom9811
Nein, die These ist nicht gewagt, sondern naheliegend. Ich weiß, was Klaus macht.
Die Werte sind auch nicht nach einer Nullung undefiniert. Sie sind jedesmal gleich. Und sie sind niemals Werrte, die vorher an die Stelle geschmuggelt wurden.
Uninitialisierte Variablen sind ein klassischer Angriffsvektor. Auch hierzu wird dir Klaus sicherlich einiges erzählen können. Der wesentliche Angriff beruht darauf, dass du etwa durch einen Bufferoverflow an anderer Stelle die Variable selbst "initialisierst", etwa eine lokale Variable.
WIE ZUM BEWEISE sehe ich gerade in meiner Source das:
Na wunderbar! Ein Angreifer kann dafür sorgen, dass er irgendwann den (noch unbenutzten) Stack überschreibt, damit später key auf $IRGENDWAS zeigt. Damit kann er dann Werte in meinem Graphen setzen.
Warum der Compiler allerdings nicht gemeckert hat …?
Würde key initialisiert, wäre dieser Angriff nicht möglich.
Original von eloso
Nagut, mag sein. Ich weiß nicht, was Klaus macht.
Original von klausel
Original von eloso
Nagut, mag sein. Ich weiß nicht, was Klaus macht.
Hättest Du die bisherigen Postings aufmerksam gelesen, wüsstest Du es.
Original von Tom9811
Wie bereits ausgeführt, ist der Code nicht von Klaus. Er überprüft ihn.
Wenn 0x0 auf unterschiedlichen Maschinen oder von untershciedlichen Compilern anders dargestellt wird, hast du ganz andere Probleme: Es fängt bereits beim Lesen der Dateien an.
Original von Tom9811
Aber das Problem uninitialisierter Variablen wird dadurch nicht umgangen, siehe oben.
Ich finde übrigens das Sicherheitsbewusstsein bemerkenswert. Eine Ansammlung von Aussagen
a) Das ist performanter (Bestimmt, bestimmt! - Jedenfalls, bis man es überprüft hat.)
b) Dann darf man das eben nicht machen bzw. muss aufpassen! (Menschen?)
c) Von Sicherheitsproblemen weiß ich nichts.
ist dafür verantwortlich, dass mein E-Mail-Postfach täglich mit Spam gefüllt ist.
Original von tjp
Botnetze braucht man nur für DDOS Attacken, diese kann man aber auch mit 100% korrekter Software nicht verhindern. Eine DDOS-Attacke bringt immer den Rechner zu Fall, sofern genügend Bots benutzt werden.
Wenn der Originalserver abgeschossen ist, kann man dem anderen Mailserver vorgaukeln, man sei das Original. Das funktioniert aber nur deshalb, weil das Mailprotokoll keine Authentifizierung beinhaltet, die sicherstellt, daß beide Partner auch die sind, die sie vorgeben zu sein. Ursächlich veranwortlich für das Problem Spam ist also das Mail Protokoll und keinerlei Softwarebug.
Original von Tom9811
Ihc kann auch gerne dein Endianess-Problem aufgreifen. In function3() haben wir einen Charbuffer. Da in function2() nur Werte bis 10 möglich sind (wird ordentlich getestet, sorgfältiger Programmierer!) ist bei der richtigen Endianess der Puffer gleich initialisiert: [0x00, 0x00, 0x00, 0x09]. Bei einem Test fällt nichts auf. Auf einer anderen Maschine hat er indessen ein Zeichen: 0x09, 0x00, 0x00, 0x00]. Das verursacht dann den Absturz des Programmes. Noch Fragen, Kienzle?
Klaus ist externer Sicherheitsberater. Er prüft sozusagen Server, Software etc. auf Angriffsmöglichkeiten. Dazu bedient er sich Standardtools (wofür er dann demnächst im Knast landet. ;-)) oder schaut sich eben Konfigurationen oder Sourcen an. Er kann daher nicht mal eben auf std:string umsteigen. Er kann nur sagen, dasss man auf std::string umsteigen sollte.