tool/metrics: measure cyclomatic complexity, num params, num functions, num gotos

This commit is contained in:
Matthias Ringwald 2019-08-27 16:26:54 +02:00
parent 9d49ac0b27
commit 38e38f2334
2 changed files with 99 additions and 0 deletions

11
tool/metrics/goto.sh Executable file
View File

@ -0,0 +1,11 @@
#!/bin/sh
grep goto -n -r ../../src
# For 9d49ac0b2
# ../../src/classic/rfcomm.c:2351: goto fail;
# ../../src/classic/rfcomm.c:2363: goto fail;
# ../../src/classic/rfcomm.c:2370: goto fail;
# ../../src/classic/rfcomm.c:2406: if (status) goto fail;
# rfcomm.c : 4 gotos in rfcomm_channel_create_internal

88
tool/metrics/metrics-lizard.py Executable file
View File

@ -0,0 +1,88 @@
#!/usr/bin/env python3
# requires https://github.com/terryyin/lizard
import lizard
import os
import sys
folders = [
'src',
'src/ble',
'src/ble/gatt-service',
'src/classic',
]
metrics = {}
targets = {}
targets['CCN'] = 10
targets['PARAM'] = 7
def metric_count(name):
global metrics
value = 0
if name in metrics:
value = metrics[name]
metrics[name] = value + 1
def metric_list(name, item):
global metrics
value = []
if name in metrics:
value = metrics[name]
value.append(item)
metrics[name] = value
def metric_max(name, max):
global metrics
if name in metrics:
if metrics[name] > max:
return
metrics[name] = max
def metric_measure(metric_name, functino_name, actual):
metric_max(metric_name + '_MAX', actual)
if metric_name in targets:
if actual > targets[metric_name]:
metric_count(metric_name + '_DEVIATIONS')
metric_list(metric_name + '_LIST', functino_name)
def analyze_file(path):
l = lizard.analyze_file(path)
for f in l.function_list:
metric_count('FUNC')
metric_measure('PARAM', f.name, f.parameter_count)
metric_measure('CCN', f.name, f.cyclomatic_complexity )
def analyze_folder(folder_path):
for file in sorted(os.listdir(folder_path)):
if file.endswith(".c"):
analyze_file(folder_path+'/'+file)
# find root
btstack_root = os.path.abspath(os.path.dirname(sys.argv[0]) + '/../..')
print ("Targets:")
for key,value in sorted(targets.items()):
print ('- %-20s: %u' % (key, value))
print ("\nAnalyzing:")
for path in folders:
print('- %s' % path)
analyze_folder(btstack_root + "/" + path)
print ("\nResult:")
for key,value in sorted(metrics.items()):
if key.endswith('LIST'):
continue
print ('- %-20s: %4u' % (key, value))
for key,value in sorted(metrics.items()):
if not key.endswith('LIST'):
continue
print ("\n%s" % key)
print ('\n'.join(value))