def make_complex_analysis(self): """ Construct a Analysis instance that uses all features """ a = Analysis( metadata=Metadata(generator=Generator(name='cpychecker', version='0.11'), sut=SourceRpm(name='python-ethtool', version='0.7', release='4.fc19', buildarch='x86_64'), file_=File(givenpath='foo.c', abspath='/home/david/coding/foo.c'), stats=Stats(wallclocktime=0.4)), results=[ Issue(cwe=681, testid='refcount-too-high', location=Location(file=File( givenpath='foo.c', abspath='/home/david/coding/foo.c'), function=Function('bar'), point=Point(10, 15)), message=Message(text='something bad involving pointers'), notes=Notes('here is some explanatory text'), trace=Trace([ State(location=Location(file=File('foo.c', None), function=Function('bar'), point=Point(7, 12)), notes=Notes('first we do this')), State(location=Location(file=File('foo.c', None), function=Function('bar'), point=Point(8, 10)), notes=Notes('then we do that')), State(location=Location(file=File('foo.c', None), function=Function('bar'), range_=Range( Point(10, 15), Point(10, 25))), notes=Notes('then it crashes here')) ]), severity='really bad', customfields=CustomFields(foo='bar')), ], customfields=CustomFields( gccinvocation='gcc -I/usr/include/python2.7 -c foo.c'), ) return a, a.results[0]
def parse_file(fileobj, sut=None, file_=None, stats=None): tree = ET.parse(fileobj) root = tree.getroot() node_cppcheck = root.find('cppcheck') version = node_cppcheck.get('version') node_errors = root.find('errors') generator = Generator(name='cppcheck', version=node_cppcheck.get('version')) metadata = Metadata(generator, sut, file_, stats) analysis = Analysis(metadata, []) for node_error in node_errors.findall('error'): # e.g.: # <error id="nullPointer" severity="error" msg="Possible null pointer dereference: end - otherwise it is redundant to check it against null." verbose="Possible null pointer dereference: end - otherwise it is redundant to check it against null."> # <location file="python-ethtool/ethtool.c" line="139"/> # <location file="python-ethtool/ethtool.c" line="141"/> # </error> testid = node_error.get('id') str_msg = node_error.get('msg') str_verbose = node_error.get('verbose') message = Message(text=str_msg) if str_verbose != str_msg: notes = Notes(str_verbose) else: notes = None location_nodes = list(node_error.findall('location')) for node_location in location_nodes: location = Location( file=File(node_location.get('file'), None), # FIXME: doesn't tell us function name # TODO: can we patch this upstream? function=None, # doesn't emit column point=Point(int(node_location.get('line')), 0)) # FIXME: bogus column issue = Issue(None, testid, location, message, notes, None, severity=node_error.get('severity')) analysis.results.append(issue) if not location_nodes: customfields = CustomFields() if str_verbose != str_msg: customfields['verbose'] = str_verbose failure = Failure(failureid=testid, location=None, message=message, customfields=customfields) analysis.results.append(failure) return analysis
def make_state(event): """ Construct a State instance from an event within the JSON """ loc = Location(file=File(givenpath=event['filePathname'], abspath=None), function=None, point=Point(int(event['lineNumber']), int(0))) notes = Notes(text=event['eventDescription']) return State(loc, notes)
def make_trace(files, path): """ Construct a Trace instance from the .plist's 'path' list """ trace = Trace([]) lastlocation = None for node in path: if 0: pprint(node) kind = node['kind'] if kind == 'event': # e.g.: # {'extended_message': "Value stored to 'ret' is never read", # 'kind': 'event', # 'location': {'col': 2, 'file': 0, 'line': 130}, # 'message': "Value stored to 'ret' is never read", # 'ranges': [[{'col': 8, 'file': 0, 'line': 130}, # {'col': 29, 'file': 0, 'line': 130}]]} # TODO: we're not yet handling the following: # node['extended_message'] # node['ranges'] loc = node['location'] location = make_location_from_point(files, loc) notes = Notes(node['message']) trace.add_state(State(location, notes)) lastlocation = location elif kind == 'control': # e.g.: # {'edges': [{'end': [{'col': 9, 'file': 0, 'line': 161}, # {'col': 9, 'file': 0, 'line': 161}], # 'start': [{'col': 2, 'file': 0, 'line': 161}, # {'col': 2, 'file': 0, 'line': 161}]}], # 'kind': 'control'} edges = node['edges'] for edge in edges: edge_start = edge['start'] edge_end = edge['end'] startloc = make_location_from_range(files, edge_start) endloc = make_location_from_range(files, edge_end) if startloc != lastlocation: trace.add_state(State(startloc, None)) trace.add_state(State(endloc, None)) lastlocation = endloc else: raise ValueError('unknown kind: %r' % kind) return trace
def to_issue(self): """ Generate an Issue from this csv row. """ location = Location(file=File(givenpath=self.file, abspath=None), function=None, # FIXME point=Point(int(self.line), int(self.column))) return Issue(cwe=None, testid=self.flag_name, location=location, message=Message(self.warning_text), notes=Notes(self.additional_text), trace=None, severity=self.priority, customfields=None)