例如,如果我要制作一个程序,该程序将排序算法作为输入并根据经验确定算法是否部分正确,我将如何将字符串输入转换为可执行程序?我已经阅读了使用exec或eval建议的其他线程,但由于安全风险,建议不要使用此方法。有没有办法创建这样一个程序,不涉及将字符串转换为可执行代码?或者无论实施如何,它本身都是一个有风险的计划吗?最后,是否有另一种编程语言可以更好地替代定义这样的程序?
答案 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)()
静态代码分析
对于最终答案,可能但不是,因为有评估排序算法的方法,但是如果不编译代码或至少解释它们,它们就不可能有效,可重现或准确。静态代码分析很困难,而且只能到目前为止。
使用单个if语句进行静态代码分析有多困难的一个简单示例如下:
for index, value in enumerate(range(10)):
if index and value - old == 1:
print(value)
old = value
一些执行静态代码分析的库认为此代码会引发错误(例如Pylint),因为old
是在首次使用后定义的,但是,因为bool(0)
会评估为了假,old
实际上只在第一个循环之后检查过,在它已经定义之后,所以代码运行没有问题。
考虑输入的复杂性,输出的复杂性以及可能的排序算法的变化数量,这些变量都是等价的。测试代码的最简单方法是运行它。动态代码分析存在局限性,但是对于给定的输入,然后将其与所需的输出进行比较,您可以很好地了解代码是否正常工作,而这仅仅是静态分析非常困难。