Disclaimer: Dieser Thread wurde aus dem alten Forum importiert. Daher werden eventuell nicht alle Formatierungen richtig angezeigt. Der ursprüngliche Thread beginnt im zweiten Post dieses Threads.
Programm
Hey, welches Programm benutzt ihr auf eurem eigenen PC um die Programmieraufgabe zu bearbeiten damit sie auch compilieren im cip- Pool.
Egal, was du daheim verwendest, solltest du immer danach nochmal in der Referenzumgebung testen.
Wenn du unter Windows arbeitest, würde ich dir Visual Studio empfehlen.
Trotzdem gilt das, was meisterT schon gesagt hat: Immer im CIP nochmal testen, schon unterschiedliche Versionen des gleichen Compilers können etwas ausmachen.
danke
ja musst ich leider feststellen bei der ersten Aufgabe
ssh & vim
Unter Windows imho am besten Visual Studio (Express oder Pro (über MSDNAA) gibt es kostenlos).
Unter Linux Texteditor deiner Wahl und die mitgelieferten Makefile’s verwenden, ich hab es damals mit Ubuntu gemacht und hat out-of-the-box funktioniert.
Aber trotzdem vor der Abgabe unbedingt einmal im CIP testen, denn nur dann kann die Aufgabe auch gewertet werden! Zur Not über ssh einloggen und remote testen (Anleitungen gibts im hier im Forum). Solange man nichts mit aufwendiger graphischer Ausgabe programmiert kann man eigentlich auch direkt über ssh (puTTy unter Windows) und remote vim programmieren, dann muss man gar nichts installieren
unter Mac benutz ich XCode, das klappt super, wenn man es einmal eingerichtet hat.
[quote=sotsoguk:1368543046]Unter Windows imho am besten Visual Studio (Express oder Pro (über MSDNAA) gibt es kostenlos).[/quote]Damit ist spätestens dann Schluss, wenn Betriebssystemfunktionen verwendet werden – die heißen dann unter Windows nämlich anders und verhalten sich nicht so wie unter Linux.
In AlgoKS?
Meh, ich hatte den Post schon mal gelesen und überlegt, ob ich das antworte, dann aber gesehen, dass es im AlgoKS-Forum ist, wo das nicht der Fall ist. Als ich den Thread diesmal gelesen habe isses mir nicht mehr aufgefallen… disregard that, I wrote bullshit.
Naja, son paar Dinge sind in Visual Studio auch komisch, die vielleicht in AlgoKS auch ein Problem sein koennten. zB hat Microsoft einen grossen Stapel String-Funktionen mit _s hintendran gebaut, die ein paar mehr Dinge pruefen und daher sicherer sein sollen. Visual Studio mault einen dann an, wenn man die nicht benutzt, d.h. es beschwert sich ueber ‘printf’ und will dass man ‘printf_s’ hinschreibt. Baut man das dann auf nicht-Windows wirds nicht funktionieren, weils kein printf_s dort gibt…
Also normalerweise will man unter Sicherheitsgesichtspunkten unter keinen Umständen mehr printf verwenden.
Braucht’s in C++ auch gar nicht. Da verwendet man streams, wie zum Beispiel std::cout. Schaut mal auf cppreference.com, was es da alles für schöne Sachen gibt.
Ich hab jetzt keine Ahnung, was sich genau hinter printf_s aus VS verbirgt(vermute stark etwas wie sprintf), aber wenn man das C-Style-mäßig machen würde, rate ich unter Linux zu bewährteren Funktionen wie
int snprintf(char *str, size_t size, const char *format, …);
oder noch besser
int vsnprintf(char *str, size_t size, const char *format, va_list ap);
zu greifen.
/*Edit:
Um auf die Ursprungsfrage zurückzukommen: Weitaus weniger wichtig als das Programm, ist die Verwendung der gleichen Kompiler- und Bibliotheksversionen.
*/
Ich glaube du verwechselst grade sprintf und printf.
[quote=raspe88]Also normalerweise will man unter Sicherheitsgesichtspunkten unter keinen Umständen mehr printf verwenden.[/quote]Warum? Wenn man beachtet, dass der Format-String nicht durch den Benutzer modifizierbar sein sollte spricht nichts gegen die Verwendung von printf.
[quote=raspe88]Ich hab jetzt keine Ahnung, was sich genau hinter printf_s aus VS verbirgt(vermute stark etwas wie sprintf), aber wenn man das C-Style-mäßig machen würde, rate ich unter Linux zu bewährteren Funktionen wie
int snprintf(char *str, size_t size, const char *format, …);
oder noch besser
int vsnprintf(char *str, size_t size, const char *format, va_list ap);
[/quote]Wo ist der Sicherheitsnachteil von printf im Vergleich zu snprintf oder vsnprintf? Im Gegenteil, letzere haben sogar noch einen Fallstrick mehr, weil man darauf achten muss, dass der Puffer nicht überläuft.
[quote=MSDN]The main difference between printf_s and printf is that printf_s checks the format string for valid formatting characters, whereas printf only checks if the format string is a null pointer.[/quote]Aha.
EDIT: JA , hab ich
Nur eine Anmerkung zu einem generellen Problem der normalen printfs:
Ein Problem bei den ganzen printfs ist halt, dass wenn Du Argumente mit reingibst, z.B. bei
char x = 'a';
printf("Bad: %s", x);
man wissen sollte, dass z.B. der gcc Dir nicht automatisch, sondern nur mit entsprechendem Flag monieren wird, dass das x nicht das ist, was laut Formatstring erwartet wird. Kompilieren funktioniert dann problemlos, nur ist das Verhalten beim printen dann undefiniert.
Das ist noch nicht so wild, die wirklich boese Falle in die man bei printf gelegentlich tappt ist, einen String auszugeben den man von irgendwo aussen bekommt mittels printf(user_string); statt printf(“%s”, user_string);
Ja
Da kann man sich hübsch den Stack ausgeben lassen, wenn man will.
Wenn’s nur das wäre …
Deswegen gibt es ja [m]-Werror=format-security[/m], das fängt die meisten solcher Probleme ab (aber auch nicht alle: sudo …). Aber mit [m]-D_FORTIFY_SOURCE=2[/m] bleibt es beim Auslesen (solange der Code dazu nicht noch mehr Bugs hat).