2016-05-08 75 views
-1

例如,如果我要製作一個程序,該程序將輸入的排序算法作爲輸入並根據經驗確定算法是否部分正確,那麼如何將字符串輸入轉換爲可執行程序?我已經閱讀了其他建議使用exec或eval的線程,但是由於安全風險,所有的答案都建議不要使用這種方法。有沒有辦法創建這樣的程序,不涉及將字符串轉換爲可執行代碼?或者無論實施如何,它本身就會是一個危險的程序?最後,是否有另一種編程語言可以成爲定義這樣一個程序的更好選擇?如何在Python中安全地操作用戶代碼?

+2

所以你的問題是「如何將字符串轉換爲可執行程序而不將字符串轉換爲可執行程序」? –

+0

沒有我的問題是「我可以寫一個程序,作爲輸入的排序算法,並根據經驗確定算法是否部分正確無需將字符串轉換爲可執行程序?」。 –

+0

然後你可能想要改變標題。 –

回答

1

執行任意代碼

無論你選擇什麼樣的語言,如果你從用戶讀取代碼並執行該代碼,這將是危險的。沒有ifs,ands或buts。您注意到Python的exec和eval的注意事項也注意到Javascript,PHP和許多其他語言。

安全地從一個字符串

有安全的方法來映射字符串預定義功能執行代碼,但沒有安全編譯/解釋和執行任意代碼的方式。

一個很好的例子是關於安全功能映射到一個字符串如下:

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

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

靜態代碼分析

和最終的答案,可能,但沒有,因爲會成爲評估排序算法的方法,但它們不可能是有效的,可重複的或準確的,無需編譯代碼或至少解釋它。靜態代碼分析是困難的,只能走得這麼遠。

如何困難,如果語句是下面的靜態代碼分析可以用一個甚至一個簡單的例子:

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

那些靜態代碼分析認爲這段代碼會產生一個錯誤(如pylint的一些圖書館例如),因爲old是在第一次使用後定義的,但是,由於bool(0)將評估爲False,實際上只有在第一個循環之後進行檢查,在已經定義之後纔會檢查,因此代碼運行時沒有問題。

想想輸入的複雜性,輸出的複雜性以及可能的排序算法的變體數量,這些算法都是等價的。測試代碼最簡單的方法就是運行它。動態代碼分析存在侷限性,但是對於給定的輸入,然後將其與所需的輸出進行比較,如果代碼能夠正常工作,則可以獲得一個好主意,而這僅僅是靜態分析非常困難的。

+1

我認爲你的意思是'和'如果索引或舊的值== 1:',因爲0是假的,假的或x == x的所有x – Copperfield

+0

@Copperfield,謝謝。我做到了。還有另一個錯字。謝謝。 –

相關問題