Skip to content
boundaries-percentage.py 2.81 KiB
Newer Older
#!/usr/bin/env python3
import argparse
import csv
import json
import math
import matplotlib.mlab as mlab
import matplotlib.pyplot as plt
import matplotlib.patches as mpatches
import numpy as np
import os
import seaborn

def get_change(current, previous):
    if current == previous:
        return 0.0
    try:
        return ((current - previous) / previous) * 100.0
    except ZeroDivisionError:
        return 100.0

# Function that takes as parameter a platform and computes averages and variance of the results, and saves them in two dedicated files (averages.dat and variances.dat)
def compute_matches(binaries_list, arch, matching_folder, output_name):

    average_list = []
    average_dimension_list = []

    for binary in binaries_list:
        inputfile = matching_folder + "/" + binary
        print("Analyzing: " + inputfile)
        with open(inputfile, 'r') as input:
            data_dict = json.load(input)

            tot_counter = 0
            pos_counter = 0

            tot_dimension = 0
            matching_dimension = 0

            for elem in data_dict:
                tot_counter += 1
                match = elem['match']
                symbol_dimension = elem['symbol_coverage_measure']
                tot_dimension += symbol_dimension
                if match == 'True':
                    pos_counter += 1
                    matching_dimension += symbol_dimension

            average_list.append(pos_counter/tot_counter)
            average_dimension_list.append(matching_dimension / tot_dimension)
            print("For binary " + binary + " the average matching is: " + str(pos_counter/tot_counter))
            print("For binary " + binary + " the matching dimension is: " + str(matching_dimension / tot_dimension))

    print("Overall recap")
    print("Average matching is: " + str(sum(average_list) / len(average_list)))
    print("Average matching dimension is: " + str(sum(average_dimension_list) / len(average_dimension_list)))


def main():
    parser = argparse.ArgumentParser(description='My nice tool.')
    parser.add_argument('binaries', metavar='BINARIESFILE', help='File containing the names of the binaries')
    parser.add_argument('arch', metavar='ARCH', help='Architecture')
    parser.add_argument('matching_folder', metavar='MATCHINGFOLDER', help='Folder containing matching information')
    parser.add_argument('output_name', metavar='OUTPUT_NAME', help='Output Name')
    args = parser.parse_args()
    arch = args.arch
    binaries = args.binaries
    matching_folder = args.matching_folder
    output_name = args.output_name

    with open(binaries, 'r') as binaries_file:
        binaries_list = [line.rstrip('\n') for line in binaries_file]

    # Call the funciton that computes the results
    compute_matches(binaries_list, arch, matching_folder, output_name)

if __name__ == "__main__":
    main()