Пример #1
0
def main():
    bitcodeFile = sys.argv[1]
    searchConfigFile = sys.argv[2]
    originalConfigFile = sys.argv[3]

    # delete log file if exists
    try:
        os.remove("log.dd")
    except OSError:
        pass

    searchConfig = json.loads(open(searchConfigFile, 'r').read())
    originalConfig = json.loads(open(originalConfigFile, 'r').read())
    changes = searchConfig["config"]
    changeSet = []
    typeSet = []

    for change in changes:
        typeList = change.values()[0]["type"]
        if isinstance(typeList, list):
            typeSet.append(typeList)
            changeSet.append(change.values()[0])

    print "Searching for valid config using delta-debugging algorithm..."
    to_highest_precision(changeSet, typeSet)
    while not is_empty(typeSet):
        search_config(changeSet, typeSet, searchConfig, bitcodeFile,
                      searchConfig, originalConfig)
    print "Check valid_" + bitcodeFile + ".json for the valid config file"
    utilities.print_config(searchConfig, "valid_" + bitcodeFile + ".json")
    utilities.print_diff(searchConfig, originalConfig,
                         "diff_" + bitcodeFile + ".json")
Пример #2
0
def random_local_search_config(change_set, type_set, switch_set, search_config,
                               original_config, bitcode, div, original_score,
                               count):

    initial_change_set = []
    for i in range(len(change_set)):
        initial_change_set.append(change_set[i]["type"])
    #print initial_change_set

    while (count > 0):
        lower = False
        while (not lower):
            if is_bottom(initial_change_set):
                return
            lower = randomly_to_2nd_highest_precision(change_set, type_set,
                                                      switch_set,
                                                      initial_change_set)
        count = count - 1
        if run_config(
                search_config, original_config, bitcode, original_score
        ) == 1 and utilities.get_dynamic_score() <= original_score:
            initial_change_set = []
            for i in range(len(change_set)):
                initial_change_set.append(change_set[i]["type"])
            utilities.print_config(search_config,
                                   "final_config_from_random_search.json")
            fp = open('log.dd', 'a')
            fp.write(".......................................\n")
            fp.close()
Пример #3
0
def main():
  bitcodeFile = sys.argv[1]
  searchConfigFile = sys.argv[2]
  originalConfigFile = sys.argv[3]

  # delete log file if exists
  try:
    os.remove("log.dd")
  except OSError:
    pass

  searchConfig = json.loads(open(searchConfigFile, 'r').read())
  originalConfig = json.loads(open(originalConfigFile, 'r').read())
  changes = searchConfig["config"]
  changeSet = []
  typeSet = []

  for change in changes:
    typeList = change.values()[0]["type"]
    if isinstance(typeList, list):
      typeSet.append(typeList)
      changeSet.append(change.values()[0])

  print "Searching for valid config using delta-debugging algorithm..."
  to_highest_precision(changeSet, typeSet)
  while not is_empty(typeSet):
    search_config(changeSet, typeSet, searchConfig, bitcodeFile, searchConfig, originalConfig)
  print "Check valid_" + bitcodeFile + ".json for the valid config file"
  utilities.print_config(searchConfig, "valid_" + bitcodeFile + ".json")
  utilities.print_diff(searchConfig, originalConfig, "diff_" + bitcodeFile + ".json")
Пример #4
0
def main():
  global search_counter
  bitcode = sys.argv[1]
  search_conf_file = sys.argv[2]
  original_conf_file = sys.argv[3]

  #
  # delete log file if exists
  #
  try:
    os.remove("log.dd")
  except OSError:
    pass

  #
  # parsing config files
  #
  search_conf = json.loads(open(search_conf_file, 'r').read())
  original_conf = json.loads(open(original_conf_file, 'r').read())
  search_changes = search_conf["config"]
  change_set = []
  type_set = []

  #
  # record the change set
  #
  for search_change in search_changes:
    type_vector = search_change.values()[0]["type"]
    if isinstance(type_vector, list):
      type_set.append(type_vector)
      change_set.append(search_change.values()[0])

  #
  # search for valid configuration
  #
  print "Searching for valid configuration using delta-debugging algorithm ..."

  # get original score
  utilities.to_highest_precision(change_set, type_set)
  utilities.run_config(search_conf, original_conf, bitcode, search_counter)
  original_score = utilities.get_dynamic_score(search_counter) * 1.05
  search_counter = search_counter + 1

  # keep searching while the type set is not searched throughout
  while not utilities.is_empty(type_set):
    search_config(change_set, type_set, search_conf, original_conf, bitcode, original_score)

  # get the score of modified program
  utilities.run_config(search_conf, original_conf, bitcode, search_counter)
  modified_score = utilities.get_dynamic_score(search_counter)
  search_counter = search_counter + 1

  if modified_score <= original_score:
    print "Check valid_" + bitcode + ".json for the valid configuration file"
    # print valid configuration file and diff file
    utilities.print_config(search_conf, "dd2_valid_" + bitcode + ".json")
    utilities.print_diff(search_conf, original_conf, "dd2_diff_" + bitcode + ".json")
  else:
    print "No configuration is found!"
Пример #5
0
def main():
    """
    main function receives
        - argv[1] : bitcode file location
        - argv[2] : search file location
        - argv[3] : original config file location
    """
    global BITCODE, SEARCH_CONF, ORIGINAL_CONF, ORIGINAL_SCORE
    BITCODE = sys.argv[1]
    SEARCH_CONF = json.loads(open(sys.argv[2], 'r').read())
    ORIGINAL_CONF = json.loads(open(sys.argv[3], 'r').read())

    # delete log file if exists
    try:
        os.remove("log.dd")
    except OSError:
        pass

    # use index to find corresponding type
    change_set = []
    type_set = []
    switch_set = []

    # parse search configuration file
    for idx, item in enumerate(SEARCH_CONF["config"]):
        type_list = item.values()[0]["type"]
        if isinstance(type_list, list):
            type_set.append(type_list)
            change_set.append(item.values()[0])
        # put function calls into switch_set
        if item.keys()[0] == "call":
            switch_set.append(item.values()[0]["switch"])
        else:
            switch_set.append([])

    # parse search grouping
    group_set = init_groups()
    print "groups: "
    print group_set
    print "\n"

    # get original score
    to_highest_precision(change_set, type_set, switch_set)
    run_config()
    ORIGINAL_SCORE = utilities.get_dynamic_score()

    # search for valid configuration using delta-debugging algorithm
    search_config(change_set, type_set, switch_set, group_set)

    # get the score of modified program
    if is_valid_config():
        print "Check valid_" + BITCODE + ".json for the valid configuration file"
        # print valid configuration file and diff file
        utilities.print_config(SEARCH_CONF, "dd2_valid_" + BITCODE + ".json")
        utilities.print_diff(SEARCH_CONF, ORIGINAL_CONF,
                             "dd2_diff_" + BITCODE + ".txt")
    else:
        print "No configuration is found!"
Пример #6
0
def random_search_config(change_set, type_set, switch_set, search_config,
                         original_config, bitcode, original_score, count):
    utilities.print_config(search_config,
                           "final_config_from_random_search.json")

    # search starts with the original config
    random_local_search_config(change_set, type_set, switch_set, search_config,
                               original_config, bitcode, 2, original_score,
                               count)
Пример #7
0
def print_config(config, configFile):
    '''
    f = open(configFile, 'w+')
    f.write("{\n")
    changeList = config["config"]
    for change in changeList:
        f.write("\t\"" + change.keys()[0] + "\": {\n")
        changeValue = change.values()[0]
        for valueInfo in changeValue.keys():
            f.write("\t\t\"" + valueInfo + "\": \"" + changeValue[valueInfo] + "\",\n")
        f.write("\t},\n")
    f.write("}\n")
    '''
    utilities.print_config(config, configFile)
Пример #8
0
def main():
    bitcode = sys.argv[1]
    search_conf_file = sys.argv[2]
    original_conf_file = sys.argv[3]

    #
    # delete log file if exists
    #
    try:
        os.remove("log.dd")
    except OSError:
        pass

    #
    # parsing config files
    #
    search_conf = json.loads(open(search_conf_file, 'r').read())
    original_conf = json.loads(open(original_conf_file, 'r').read())
    search_changes = search_conf["config"]
    change_set = []
    type_set = []

    #
    # record the change set
    #
    for search_change in search_changes:
        type_vector = search_change.values()[0]["type"]
        if isinstance(type_vector, list):
            type_set.append(type_vector)
            change_set.append(search_change.values()[0])

    #
    # search for valid configuration
    #
    print "Searching for valid configuration using delta-debugging algorithm ..."

    # get original score
    original_score = -1

    # keep searching while the type set is not searched throughout
    while not is_empty(type_set):
        search_config(change_set, type_set, search_conf, original_conf,
                      bitcode, original_score)

    #if modified_score <= original_score:
    print "Check valid_" + bitcode + ".json for the valid configuration file"
    # print valid configuration file and diff file
    utilities.print_config(search_conf, "dd2_valid_" + bitcode + ".json")
    utilities.print_diff(search_conf, original_conf,
                         "dd2_diff_" + bitcode + ".json")
Пример #9
0
def random_search_config(change_set, type_set, switch_set, search_config, original_config, bitcode, original_score, total_count):
  utilities.print_config(search_config, "final_config_from_random_search.json")
  
  count=total_count
  opt_score=original_score
  while(count>0):
    # search starts with a random initial config
    to_random_precision(change_set, type_set, switch_set)
    count=count-1
    if run_config(search_config, original_config, bitcode, opt_score) == 1 and utilities.get_dynamic_score() <= opt_score:
      initial_score = utilities.get_dynamic_score()
      utilities.print_config(search_config, "final_config_from_random_search.json")
      fp = open('log.dd', 'a')
      fp.write("START local search <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<\n")
      fp.close()
      random_count=random.randint(0, count)
      if random_count>0:
        opt_score=random_local_search_config(change_set, type_set, switch_set, search_config, original_config, bitcode, 2, initial_score, random_count)
      count=count-random_count
      fp = open('log.dd', 'a')
      fp.write("END local search >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>\n")
      fp.close()
Пример #10
0
def run_config(config, bitcodeFile, searchConfig, originalConfig):
  global search
  utilities.print_config(config, "config_temp.json")
  result = transform.transform(bitcodeFile, "config_temp.json")
  if result == 1:
    utilities.print_config(config, "VALID_config_" + bitcodeFile + "_" + str(search) + ".json")
    utilities.log_config(config, "VALID", "log.dd", search)
    utilities.print_diff(searchConfig, originalConfig, "diff_" + bitcodeFile + "_" + str(search) + ".json")
  elif result == 0:
    utilities.print_config(config, "INVALID_config_" + bitcodeFile + "_" + str(search) + ".json")
    utilities.log_config(config, "INVALID", "log.dd", search)
  elif result == -1:
    utilities.print_config(config, "FAIL1_config_" + bitcodeFile + "_" + str(search) + ".json")
    utilities.log_config(config, "FAIL1", "log.dd", search)
  elif result == -2:
    utilities.print_config(config, "FAIL2_config_" + bitcodeFile + "_" + str(search) + ".json")
    utilities.log_config(config, "FAIL2", "log.dd", search)
  elif result == -3:
    utilities.print_config(config, "FAIL3_config_" + bitcodeFile + "_" + str(search) + ".json")
    utilities.log_config(config, "FAIL3", "log.dd", search)

  search += 1
  return result
Пример #11
0
def run_config(search_config, original_config, bitcode):
    global search_counter
    utilities.print_config(search_config, "config_temp.json")
    result = transform_notime.transform(bitcode, "config_temp.json")
    if result == 1:
        utilities.print_config(
            search_config,
            "VALID_config_" + bitcode + "_" + str(search_counter) + ".json")
        utilities.log_config(search_config, "VALID", "log.dd", search_counter)
        utilities.print_diff(
            search_config, original_config,
            "dd2_diff_" + bitcode + "_" + str(search_counter) + ".json")
    elif result == 0:
        utilities.print_config(
            search_config,
            "INVALID_config_" + bitcode + "_" + str(search_counter) + ".json")
        utilities.log_config(search_config, "INVALID", "log.dd",
                             search_counter)
    elif result == -1:
        utilities.print_config(
            search_config,
            "FAIL1_config_" + bitcode + "_" + str(search_counter) + ".json")
        utilities.log_config(search_config, "FAIL1", "log.dd", search_counter)
    elif result == -2:
        utilities.print_config(
            search_config,
            "FAIL2_config_" + bitcode + "_" + str(search_counter) + ".json")
        utilities.log_config(search_config, "FAIL2", "log.dd", search_counter)
    elif result == -3:
        utilities.print_config(
            search_config,
            "FAIL3_config_" + bitcode + "_" + str(search_counter) + ".json")
        utilities.log_config(search_config, "FAIL3", "log.dd", search_counter)
    else:
        utilities.print_config(
            search_config,
            "FAIL4_config_" + bitcode + "_" + str(search_counter) + ".json")
        utilities.log_config(search_config, "FAIL4", "log.dd", search_counter)

    search_counter += 1
    return result
Пример #12
0
def main():
    bitcode = sys.argv[1]
    search_conf_file = sys.argv[2]
    original_conf_file = sys.argv[3]
    partition_conf_file = sys.argv[4]
    #partition_conf_file = "partition.json"

    #
    # delete log file if exists
    #
    try:
        os.remove("log.dd")
    except OSError:
        pass

    if __debug__:
        try:
            os.remove("ivy.log")
        except OSError:
            pass

    #
    # get original config and score
    #
    original_conf = json.loads(open(original_conf_file, 'r').read())
    run_config(original_conf, original_conf, bitcode, 0)
    original_score = utilities.get_dynamic_score()
    if __debug__:
        fp = open('ivy.log', 'a')
        print >> fp, "---------"
        print >> fp, "original score"
        print >> fp, original_score
        fp.close()

    #
    # hierarchically type tuning
    #
    partition_tree = json.loads(open(partition_conf_file, 'r').read())
    curr_conf = None
    curr_score = -1
    level = len(partition_tree) - 1
    while level >= 0:

        if __debug__:
            fp = open('ivy.log', 'a')
            print >> fp, "partition level and config"
            print >> fp, level, partition_tree[level]
            fp.close()

        search_conf = json.loads(open(search_conf_file, 'r').read())
        change_items = search_conf['config']

        # delete from the search space the configs that have been pruned
        if curr_conf != None:
            reach_bottom_label = 1
            for i in range(len(curr_conf['config'])):
                curr_type = curr_conf['config'][i].values()[0]["type"]
                type_vector = change_items[i].values()[0]["type"]
                index = type_vector.index(curr_type)
                if index != 0:
                    reach_bottom_label = 0
                del type_vector[index + 1:]
                if change_items[i].keys()[0] == "call":
                    del change_items[i].values()[0]["switch"][index + 1:]

            if reach_bottom_label == 1:
                break

        # create communities based on the current level of the partition tree
        global community_obj
        community_obj = com.community(partition_tree, change_items, level)

        if __debug__:
            fp = open('ivy.log', 'a')
            print >> fp, "community configs:"
            print >> fp, community_obj.confs
            fp.close()

        #
        # record the change set
        #
        search_changes = community_obj.confs
        change_set = []
        type_set = []
        switch_set = []
        for i in range(len(search_changes)):
            type_vector = search_changes[i]["type"]
            if isinstance(type_vector, list):
                if len(type_vector) == 1:
                    tmp_set = []
                    tmp_type_set = []
                    tmp_switch_set = []
                    tmp_set.append(search_changes[i])
                    tmp_type_set.append(type_vector)
                    if "switch" in community_obj.get_vars(
                            search_changes[i]["name"])[0].keys():
                        tmp_switch_set.append(
                            community_obj.get_vars(
                                search_changes[i]["name"])[0]["switch"])
                    else:
                        tmp_switch_set.append([])
                    to_highest_precision(tmp_set, tmp_type_set, tmp_switch_set)
                else:
                    type_set.append(type_vector)
                    change_set.append(search_changes[i])

                    if (len(community_obj.get_vars(search_changes[i]["name"]))
                            == 1) & ("switch" in community_obj.get_vars(
                                search_changes[i]["name"])[0].keys()):
                        switch_set.append(
                            community_obj.get_vars(
                                search_changes[i]["name"])[0]["switch"])
                    else:
                        switch_set.append([])

        #
        # search for valid configuration
        #
        print "Searching for valid configuration using delta-debugging algorithm ..."

        # get current score
        if curr_score == -1:
            curr_score = original_score  ## 0.95
            curr_conf = original_conf

        # keep searching while the type set is not searched throughout
        while not is_empty(type_set):
            search_config(change_set, type_set, switch_set, search_conf,
                          original_conf, bitcode, original_score)

        # get the score of modified program
        run_config(search_conf, original_conf, bitcode, 0)
        modified_score = utilities.get_dynamic_score()
        if modified_score <= curr_score:
            curr_conf = search_conf
            curr_score = modified_score
            if __debug__:
                fp = open('ivy.log', 'a')
                print >> fp, "---------"
                print >> fp, "updating new score"
                print >> fp, curr_score
                fp.close()

        # print the intermediate level configuration
        utilities.print_config(
            curr_conf,
            "dd2_valid_level" + str(level) + "_" + bitcode + ".json")
        fleveline = open("log.dd", "a")
        fleveline.write(
            "----------------------------------------------------------------------\n"
        )
        fleveline.close()

        # check the modified configuration
        '''
        if is_bottom_type(change_set):
            if __debug__ :
                fp = open('ivy.log', 'a')
                print>>fp, "stop searching : reach bottom types"
                print>>fp, search_conf
                print>>fp, "change set:"
                print>>fp, change_set
                fp.close()
            break
        '''

        level -= 1

    # print tuning result
    if (curr_score <= original_score) & (curr_conf != None):
        #print valid configuration file and diff file
        diff = utilities.print_diff(curr_conf, original_conf,
                                    "dd2_diff_" + bitcode + ".json")
        if diff:
            utilities.print_config(curr_conf, "dd2_valid_" + bitcode + ".json")
            print "original_score: ", original_score
            print "modified_score: ", curr_score
            fp = open('time.txt', 'a')
            print >> fp, curr_score, "/", original_score
            fp.close()
            print "Check valid_" + bitcode + ".json for the valid configuration file"
            return

    print "No configuration is found!"
Пример #13
0
def run_config(search_config, original_config, bitcode, timeout):
    if False:
        fp = open('ivy.log', 'a')
        print >> fp, "run config:"
        print >> fp, "search_config:"
        print >> fp, search_config
        fp.close()
    global search_counter
    print "** Exploring configuration #" + str(search_counter)
    utilities.print_config(search_config, "config_temp.json")
    result = transform2.transform(bitcode, "config_temp.json", timeout)
    if result == 1:
        utilities.print_config(
            search_config,
            "VALID_config_" + bitcode + "_" + str(search_counter) + ".json")
        utilities.log_config(search_config, "VALID", "log.dd", search_counter)
        utilities.print_diff(
            search_config, original_config,
            "dd2_diff_" + bitcode + "_" + str(search_counter) + ".json")
    elif result == 0:
        utilities.print_config(
            search_config,
            "INVALID_config_" + bitcode + "_" + str(search_counter) + ".json")
        utilities.log_config(search_config, "INVALID", "log.dd",
                             search_counter)
    elif result == -1:
        utilities.print_config(
            search_config,
            "FAIL1_config_" + bitcode + "_" + str(search_counter) + ".json")
        utilities.log_config(search_config, "FAIL1", "log.dd", search_counter)
    elif result == -2:
        utilities.print_config(
            search_config,
            "FAIL2_config_" + bitcode + "_" + str(search_counter) + ".json")
        utilities.log_config(search_config, "FAIL2", "log.dd", search_counter)
    elif result == -3:
        utilities.print_config(
            search_config,
            "FAIL3_config_" + bitcode + "_" + str(search_counter) + ".json")
        utilities.log_config(search_config, "FAIL3", "log.dd", search_counter)
    else:
        utilities.print_config(
            search_config,
            "FAIL4_config_" + bitcode + "_" + str(search_counter) + ".json")
        utilities.log_config(search_config, "FAIL4", "log.dd", search_counter)

    search_counter += 1
    return result
Пример #14
0
def main():
  bitcode = sys.argv[1]
  search_conf_file = sys.argv[2]
  original_conf_file = sys.argv[3]

  if len(sys.argv)>4:
    total_count = int(sys.argv[4])
  else:
    total_count = 1000

  #
  # delete log file if exists
  #
  try:
    os.remove("log.dd")
  except OSError:
    pass

  #
  # get configs and the topological order
  #
  search_conf = json.loads(open(search_conf_file, 'r').read())
  original_conf = json.loads(open(original_conf_file, 'r').read())
  

  #
  # parsing config files
  #
  search_changes = search_conf["config"]
  change_set = []
  type_set = []
  switch_set = []

  #
  # record the change set
  #
  for search_change in search_changes:
    type_vector = search_change.values()[0]["type"]
    if isinstance(type_vector, list):
      type_set.append(type_vector)
      change_set.append(search_change.values()[0])
    if search_change.keys()[0] == "call": 
      switch_set.append(search_change.values()[0]["switch"])
    else:
      switch_set.append([])

  #
  # search for valid configuration
  #
  print "Searching for valid configuration using delta-debugging algorithm ..."

  # get original score
  to_highest_precision(change_set, type_set, switch_set)
  run_config(search_conf, original_conf, bitcode, 0)
  original_score = utilities.get_dynamic_score() ## 0.95

  # keep searching while the type set is not searched throughout
  if not is_empty(type_set):
    random_search_config(change_set, type_set, switch_set, search_conf, original_conf, bitcode, original_score, total_count)

  # get the score of modified program
  cmd="sed -i -e '1s/{/{\"config\": [/' -e 's/\"localVar/{\"localVar/' -e 's/\"call/{\"call/' -e 's/},/}},/' -e 's/\"name\(.*\),/\"name\\1/' final_config_from_random_search.json"
  os.system(cmd)
  os.system("tac <final_config_from_random_search.json | sed -e '2s/},/}/' -e '1s/}/]}/' | tac >tmp_final_config_from_random_search.json")
  os.system("mv tmp_final_config_from_random_search.json final_config_from_random_search.json")
  search_conf = json.loads(open("final_config_from_random_search.json", 'r').read())
  run_config(search_conf, original_conf, bitcode, 0)
  modified_score = utilities.get_dynamic_score()

  if modified_score <= original_score:
    # print valid configuration file and diff file
    utilities.print_config(search_conf, "dd2_valid_" + bitcode + ".json")
    diff = utilities.print_diff(search_conf, original_conf, "dd2_diff_" + bitcode + ".json")
    if diff:
      print "original_score: ", original_score
      print "modified_score: ", modified_score
      fp = open('time.txt', 'a')
      print>>fp, modified_score, "/", original_score
      fp.close()
      print "Check valid_" + bitcode + ".json for the valid configuration file"
      return
    
  print "No configuration is found!"
Пример #15
0
def main():
    bitcode = sys.argv[1]
    search_conf_file = sys.argv[2]
    original_conf_file = sys.argv[3]

    #
    # delete log file if exists
    #
    try:
        os.remove("log.dd")
    except OSError:
        pass

    #
    # parsing config files
    #
    search_conf = json.loads(open(search_conf_file, 'r').read())
    original_conf = json.loads(open(original_conf_file, 'r').read())
    search_changes = search_conf["config"]
    change_set = []
    type_set = []
    switch_set = []

    #
    # record the change set
    #
    for search_change in search_changes:
        type_vector = search_change.values()[0]["type"]
        if isinstance(type_vector, list):
            type_set.append(type_vector)
            change_set.append(search_change.values()[0])
        if search_change.keys()[0] == "call":
            switch_set.append(search_change.values()[0]["switch"])
        else:
            switch_set.append([])

    print switch_set

    #
    # search for valid configuration
    #
    print "Searching for valid configuration using delta-debugging algorithm ..."

    # get original score
    to_highest_precision(change_set, type_set, switch_set)
    run_config(search_conf, original_conf, bitcode)
    original_score = utilities.get_dynamic_score()  ## 0.95

    # keep searching while the type set is not searched throughout
    while not is_empty(type_set):
        search_config(change_set, type_set, switch_set, search_conf,
                      original_conf, bitcode, original_score)

    # get the score of modified program
    run_config(search_conf, original_conf, bitcode)
    modified_score = utilities.get_dynamic_score()

    if modified_score <= original_score:
        print "Check valid_" + bitcode + ".json for the valid configuration file"
        # print valid configuration file and diff file
        utilities.print_config(search_conf, "dd2_valid_" + bitcode + ".json")
        utilities.print_diff(search_conf, original_conf,
                             "dd2_diff_" + bitcode + ".json")
    else:
        print "No configuration is found!"
Пример #16
0
def run_config(search_config, original_config, bitcode):
  global search_counter
  utilities.print_config(search_config, "config_temp.json")
  result = transform_notime.transform(bitcode, "config_temp.json")
  if result == 1:
    utilities.print_config(search_config, "VALID_config_" + bitcode + "_" + str(search_counter) + ".json")
    utilities.log_config(search_config, "VALID", "log.dd", search_counter)
    utilities.print_diff(search_config, original_config, "dd2_diff_" + bitcode + "_" + str(search_counter) + ".json")
  elif result == 0:
    utilities.print_config(search_config, "INVALID_config_" + bitcode + "_" + str(search_counter) + ".json")
    utilities.log_config(search_config, "INVALID", "log.dd", search_counter)
  elif result == -1:
    utilities.print_config(search_config, "FAIL1_config_" + bitcode + "_" + str(search_counter) + ".json")
    utilities.log_config(search_config, "FAIL1", "log.dd", search_counter)
  elif result == -2:
    utilities.print_config(search_config, "FAIL2_config_" + bitcode + "_" + str(search_counter) + ".json")
    utilities.log_config(search_config, "FAIL2", "log.dd", search_counter)
  elif result == -3:
    utilities.print_config(search_config, "FAIL3_config_" + bitcode + "_" + str(search_counter) + ".json")
    utilities.log_config(search_config, "FAIL3", "log.dd", search_counter)
  else:
    utilities.print_config(search_config, "FAIL4_config_" + bitcode + "_" + str(search_counter) + ".json")
    utilities.log_config(search_config, "FAIL4", "log.dd", search_counter)

  search_counter += 1
  return result
Пример #17
0
def main():
  global search_counter
  bitcode = sys.argv[1]
  search_conf_file = sys.argv[2]
  original_conf_file = sys.argv[3]

  #
  # delete log file if exists
  #
  try:
    os.remove("log.dd")
  except OSError:
    pass

  #
  # parsing config files
  #
  search_conf = json.loads(open(search_conf_file, 'r').read())
  original_conf = json.loads(open(original_conf_file, 'r').read())
  search_changes = search_conf["config"]
  change_set = []
  type_set = []

  #
  # record the change set
  #
  for search_change in search_changes:
    type_vector = search_change.values()[0]["type"]
    if isinstance(type_vector, list):
      type_set.append(type_vector)
      change_set.append(search_change.values()[0])


  # get original score
  utilities.to_highest_precision(change_set, type_set)
  utilities.run_config(search_conf, original_conf, bitcode, search_counter)
  original_score = utilities.get_dynamic_score(search_counter) * 1.05
  search_counter = search_counter + 1

  cpu_no = CPU_NO
  # multiprocessing.cpu_count()
  #
  # search for valid configuration
  #
  print "Searching for valid configuration using delta-debugging algorithm ..."
  # keep searching while the type set is not searched throughout
  while not utilities.is_empty(type_set):
    #
    # distribute change set
    #
    dis_no = ((len(change_set)-1)/cpu_no)+1
    queue = Queue()
    workers = []
    for i in xrange(cpu_no):
      workers.append(Process(target=search_config_dis, args=(
        change_set[i*dis_no:min((i+1)*dis_no, len(change_set))],
        type_set[i*dis_no:min((i+1)*dis_no, len(type_set))],
        search_conf, original_conf, bitcode, search_counter + i*dis_no*dis_no, i*dis_no, queue)))

    utilities.to_highest_precision(change_set, type_set)
    for w in workers:
      w.start()

    for w in workers:
      w.join()

    print len(type_set)
    while not queue.empty():
      inx = queue.get()
      print inx
      del(type_set[inx][:])

    j = 0
    while j < len(type_set):
      if len(type_set[j]) == 0:
        type_set.pop(j)
        change_set.pop(j)
      else:
        j += 1

    search_counter += cpu_no*dis_no*dis_no
    search_config(change_set, type_set, search_conf, original_conf, bitcode, original_score)

  # get the score of modified program
  utilities.run_config(search_conf, original_conf, bitcode, search_counter)
  modified_score = utilities.get_dynamic_score(search_counter)
  search_counter = search_counter + 1

  if modified_score <= original_score:
    print "Check valid_" + bitcode + ".json for the valid configuration file"
    # print valid configuration file and diff file
    utilities.print_config(search_conf, "dd2_valid_" + bitcode + ".json")
    utilities.print_diff(search_conf, original_conf, "dd2_diff_" + bitcode + ".json")
  else:
    print "No configuration is found!"
Пример #18
0
def run_config(config, bitcodeFile, searchConfig, originalConfig):
    global search
    utilities.print_config(config, "config_temp.json")
    result = transform.transform(bitcodeFile, "config_temp.json")
    if result == 1:
        utilities.print_config(
            config,
            "VALID_config_" + bitcodeFile + "_" + str(search) + ".json")
        utilities.log_config(config, "VALID", "log.dd", search)
        utilities.print_diff(
            searchConfig, originalConfig,
            "diff_" + bitcodeFile + "_" + str(search) + ".json")
    elif result == 0:
        utilities.print_config(
            config,
            "INVALID_config_" + bitcodeFile + "_" + str(search) + ".json")
        utilities.log_config(config, "INVALID", "log.dd", search)
    elif result == -1:
        utilities.print_config(
            config,
            "FAIL1_config_" + bitcodeFile + "_" + str(search) + ".json")
        utilities.log_config(config, "FAIL1", "log.dd", search)
    elif result == -2:
        utilities.print_config(
            config,
            "FAIL2_config_" + bitcodeFile + "_" + str(search) + ".json")
        utilities.log_config(config, "FAIL2", "log.dd", search)
    elif result == -3:
        utilities.print_config(
            config,
            "FAIL3_config_" + bitcodeFile + "_" + str(search) + ".json")
        utilities.log_config(config, "FAIL3", "log.dd", search)

    search += 1
    return result