2013-10-19 4 views
5

Da Sie ein Windows-exklusives Programm erstellen, warum sind Anrufe zu system() so gehasst? Seit ich angefangen habe in C++ zu programmieren, habe ich "Do not Touch System" etwas sehr viel gehört. Ich habe diesen Grundsatz gehorsam befolgt, aber was ist daran so schlimm?Was ist so schlimm an System()?

+4

Plus, sind die Dinge, die Menschen neigen dazu, in 'System()' einfügen sind in der Regel nur so dumm, wie das Löschen des Bildschirms oder pausiert. Es wird eher als fauler und suboptimaler Weg verwendet, etwas zu tun, das im tatsächlichen Code viel besser wäre. –

+0

Wenn Sie es falsch machen und unsanitierte Benutzereingaben weitergeben, öffnen Sie Ihre Anwendung, um Injektionsschwachstellen zu steuern. Ein Angreifer kann beliebige Befehle mit denselben Berechtigungen wie Ihre Anwendung ausführen. –

+2

Mach was du willst, wenn du weißt, was du tust. – deepmax

Antwort

6

Was Sie in den Systemaufruf eingeben, hängt davon ab, auf welchem ​​Betriebssystem Sie das Programm ausführen. Es ist also komplett nicht portabel. Außerdem können viele Dinge schiefgehen, da Sie einfach einen Befehl in die Leere werfen und hoffen, dass alles gut geht. Fehlerbehandlung (zum Beispiel - das Programm, das Sie ausführen möchten, existiert nicht, oder PATH ist nicht richtig eingestellt, oder Sie haben keine Berechtigungen, etc.) ist sehr schwer oder sogar unmöglich.

Abgesehen davon, wie in den Kommentaren die meiste Zeit (wirklich "am meisten", wie 99,999%) bemerkt, gibt es keine Notwendigkeit, system zu verwenden.

+0

"So ist es komplett nicht tragbar." System(""); sieht für mich ziemlich tragbar aus – user1233963

5

std::system() erfordert, dass Sie dem Befehl vertrauen, um das zu tun, was Sie wollen. Sie haben keine Möglichkeit zu überprüfen, ob diese Annahme gerechtfertigt ist. Zum Beispiel kann ein ungewöhnlicher Wert für die Umgebungsvariable PATH dazu führen, dass ein anderes Programm als in der Standardkonfiguration ausgeführt wird.

Das Verhalten eines Anrufs an std::system() ist systemabhängig. Auch wenn die Anforderung im Moment ist, dass die Anwendung nicht auf einem anderen Betriebssystem ausgeführt werden muss, kann sich diese Anforderung ändern. Wenn man bedenkt, dass std::system() oft für Zwecke verwendet wird, die portabler (insbesondere von Anfängern) erreicht werden können, ist die Einführung einer Plattformabhängigkeit hier nicht erforderlich.

1

system() ruft den Befehlsinterpreter des Betriebssystems als separaten Prozess auf. Mehr als oft nicht, gibt es native APIs, um das gleiche Ergebnis direkt innerhalb des aufrufenden Prozesses und mit mehr Kontrolle darüber zu erreichen.

Verwandte Themen