2013-02-18 92 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