2013-02-18 60 views
0

我正在处理一些由美国CERT编写的python软件来做一些模糊处理。该软件中包含一个minimizer.py工具,该工具被设计用于针对某些导致崩溃的测试案例运行,以确定哪些字节突变导致崩溃。Python无类型_getitem_错误

但是,当试图运行该工具时,它正在向我吐出一个错误。谷歌搜索工具和错误都是空白。尝试使用有限的python体验自己排除故障也无济于事。任何想法导致错误,所以我可以解决它,让工具工作?正在使用

命令行选项是:minimizer.py --stringmode

误差输出如下:

Traceback (most recent call last): 
File "C:\FOE2\tools\minimize.py", line 234, in <module> 
main() 
File "C:\FOE2\tools\minimize.py", line 183, in main 
config = Config(cfg_file).config 
File "C:\FOE2\certfuzz\campaign\config\__init__.py", line 76, in __init__ 
self._set_derived_options() 
File "C:\FOE2\certfuzz\campaign\config\foe_config.py", line 93, in _set_derived_options 
t = Template(self.config['target']['cmdline_template']) 
TypeError: 'NoneType' object has no attribute '__getitem__' 

从两个文件的代码段中的错误的最后两行是:

__init__.py

def __init__(self, config_file): 
    self.file = config_file 
    self.config = None 

    self.load() 
    self._set_derived_options() 

    self.validations = [] 
    self._add_validations() 
    self.validate() 

def _set_derived_options(self): 
    pass 

然后从foe_config_.py(添加的代码前行,以防万一他们是相关的。):

class Config(ConfigBase): 
    def _add_validations(self): 
    self.validations.append(self._validate_debugger_timeout_exceeds_runner) 

    def _set_derived_options(self): 
    # interpolate program name 
    # add quotes around $SEEDFILE 
    t = Template(self.config['target']['cmdline_template']) 
    #self.config['target']['cmdline_template'] = t.safe_substitute(PROGRAM=self.config['target']['program']) 
    self.config['target']['cmdline_template'] = t.safe_substitute(PROGRAM=quoted(self.config['target']['program']), SEEDFILE=quoted('$SEEDFILE')) 

回答

4

很难从您发布的代码告诉,但它看起来像__init__self.configNone。然后调用_set_derived_options它在这里使用self.config

t = Template(self.config['target']['cmdline_template']) 

self.config没有被None改变。你不会指望None['target']给你任何东西(除了例外),但我认为这基本上是你在这里做的。

+0

+1。另一种可能性是,你将'self.config'设置为'dict'(或者可能是一个'defaultdict',对于丢失的键返回'None',或者......),但是'self.config ['target']'本身是'None',这会导致相同的错误。如果你想检查,分解你的代码,例如:'target = self.config ['target']','template = target ['cmdline_template']','t = Template(template)'。这将告诉你哪一个失败。在你使用它之前,给你一个机会来'打印'或'记录'每行的值。 – abarnert 2013-02-18 19:20:22

+0

非常感谢您指出了这一点,我查看了__init__,定义该函数的类需要在启动时传递配置文件。将命令行参数更改为包含--config = ,并像魅力一样工作。谢谢一堆! – Stev0 2013-02-18 19:20:51

+0

@ Stev0 - 大概是'self.load()'负责的 - 我现在看到它。 – mgilson 2013-02-18 19:24:46