2013-10-19 8 views
5

Windows専用のプログラムを構築しているとすれば、なぜsystem()への呼び出しは嫌われますか?私がC++でプログラミングを始めて以来、 "システムに触れないでください"という言葉は私が大変聞いたことでした。私はその原則を従順に守ってきましたが、それについては何が悪いですか?system()については何が悪いですか?

+4

さらに、人々が 'system()'に入れたいと思っていることは、通常、スクリーンをクリアするか、一時停止するようなものです。これは、実際のコードでもっとうまくやっていくことをやるための、怠惰で最適な方法として使われる傾向があります。 –

+0

あなたが間違っていて、非安定化されたユーザー入力を渡すと、アプリケーションを開いてインジェクションの脆弱性を突き止めることができます。攻撃者はアプリケーションと同じ権限で任意のコマンドを実行できます。 –

+2

何をしているのか分かっているなら、何でもしてください。 – deepmax

答えて

6

システムコールの中に入れるものは、プログラムを実行するOSによって異なります。だから完全に移植性がありません。また、多くのことが間違っている可能性があります。あなたはただ空中に命令を投げているだけで、すべてがうまくいくことを願っています。エラー処理(たとえば、実行するプログラムが存在しないか、PATHが正しく設定されていないか、権限がないなど)は非常に困難であり、不可能です。

これ以外にも、ほとんどの場合コメント(実際には「ほとんど」、99.999%など)に記載されているように、systemを使用する必要はありません。

+0

"これは完全に移植性がありません。"システム("");私にはかなり可愛い – user1233963

5

std::system()は、あなたが望むことを実行するコマンドを信頼する必要があります。この仮定が正当化されているかどうかを検証する方法はありません。たとえば、PATH環境変数の値が異常な場合、標準セットアップとは異なるプログラムが実行される可能性があります。

std::system()への呼び出しの動作はシステムによって異なります。現在のところ、アプリケーションが他のオペレーティングシステムで実行する必要がないという要件であっても、この要件は変更される可能性があります。 std::system()は、より移植性の高い方法で(特に初心者で)達成できる目的でよく使用されることを考慮すると、ここでプラットフォームの依存性を導入する必要はありません。

1

system()は、OSのコマンドインタープリタを別のプロセスとして起動します。たまには、呼び出し元のプロセス内で直接同じ結果を達成し、さらにそれを制御できるネイティブAPIがあります。

関連する問題