2016-05-08 10 views
-1

たとえば、ソートアルゴリズムを入力として受け取り、アルゴリズムが部分的に正しいかどうかを経験的に判断するプログラムを作成する場合、文字列入力を実行可能プログラムにどのように変換すればよいでしょうか?私はexecかevalを使って示唆された他のスレッドを読んだが、セキュリティ上のリスクのためにこのメソッドを使うことを推奨していない。文字列を実行可能なコードに変換することを伴わないプログラムを作成する方法はありますか?あるいは、それは本質的に実装に関係なく危険なプログラムになるでしょうか?最後に、そのようなプログラムを定義するためのより良い代替手段となる別のプログラミング言語がありますか?ユーザーからのコードを読んで、そのコードを実行した場合Pythonでユーザコードを安全に操作する方法は?

+2

「文字列を実行可能プログラムに変換せずに文字列を実行可能プログラムに変換するにはどうすればよいですか」という質問がありますか? –

+0

私の質問は「文字列を実行可能プログラムに変換せずにアルゴリズムが部分的に正しいかどうか、ソートアルゴリズムを入力として受け取り、経験的に決定するプログラムを書くことができますか? –

+0

タイトルを変更することができます。 –

答えて

1

任意のコードが実行

どんなにあなたが選ぶどのような言語、それは危険なことはないだろう。 ifs、ands、butsはありません。 Pythonのexecとevalに対する同じ警告が、JavascriptPHP、および他の多くの言語にも記載されています。

安全に文字列からコードを実行

事前に定義された関数に文字列をマッピングするための安全な方法がありますが、任意のコードをコンパイル/解釈して実行するためのいかなる安全な方法はありません。

一つの良い例が安全​​に文字列に機能をマッピングする方法については以下の通りである。そこに同じように、潜在的に、

functions = { 
    'print': print, 
    'str': str, 
    'int': int 
} 

name = input('Choose from the above functions here') 
functions.get(name)() 

静的コード分析

そして、最終的な答えのために、ありませんソートアルゴリズムを評価する方法ですが、コードをコンパイルしたり、少なくとも解釈したりすることなく、効果的、再現可能、正確である可能性は低いです。静的コード解析は難しく、これまでのところしかできません。

文は以下である場合は、静的コード解析は、単一でも、することができますどのように困難なため一つの簡単な例:このコードは、このようなPylintなどのエラーを(上げるだろうと思い静的コード分析を行う

for index, value in enumerate(range(10)): 
    if index and value - old == 1: 
     print(value) 
    old = value 

いくつかのライブラリ最初に使用された後にoldが定義されていますが、bool(0)はFalseと評価されるため、実際には最初のループの後でチェックされています。

入力の複雑さ、出力の複雑さ、および可能なソートアルゴリズムのバリエーションの数がすべて同等であると考えてください。コードをテストする最も簡単な方法は、それを実行することです。動的コード分析には限界がありますが、与えられた入力を使ってそれを所望の出力と比較すると、コードが正常に動作すれば良いアイデアを得ることができます。

+1

私はあなたが 'index or old-value == 1ならば'と 'を意味すると思います.0がfalseで' falseまたはx == x'のすべてのxに対して – Copperfield

+0

@Copperfield、 。やった。別のタイプミスもありました。ありがとう。 –

関連する問題