// Run each function from the specified set of functions in order to produce an output set for each function. Then insert // the functions into the bottom of the specified PartitionForest. This runs one iteration of partitioning. void partition_functions(RTS_Message *m, PartitionForest &partition, const Functions &functions, PointerDetectors &pointers, InputValues &inputs, PartitionForest::Vertex *parent) { for (Functions::const_iterator fi=functions.begin(); fi!=functions.end(); ++fi) { PointerDetectors::iterator ip = pointers.find(*fi); assert(ip!=pointers.end()); CloneDetection::Outputs<RSIM_SEMANTICS_VTYPE> *outputs = fuzz_test(*fi, inputs, ip->second); #if 1 /*DEBUGGING [Robb Matzke 2013-01-14]*/ std::ostringstream output_values_str; OutputValues output_values = outputs->get_values(); for (OutputValues::iterator ovi=output_values.begin(); ovi!=output_values.end(); ++ovi) output_values_str <<" " <<*ovi; m->mesg("%s: function output values are {%s }", name, output_values_str.str().c_str()); #endif partition.insert(*fi, output_values, parent); } }
int main(int argc, char *argv[]) { LHADecoderType *dtype; unsigned int i; time_t now; char timestr[32]; if (argc < 2) { printf("Usage: %s <decoder-type> [filename]\n", argv[0]); exit(-1); } algorithm = argv[1]; dtype = lha_decoder_for_name(algorithm); if (dtype == NULL) { fprintf(stderr, "Unknown decoder type '%s'\n", algorithm); exit(-1); } if (argc >= 3) { run_from_file(dtype, argv[2]); } else { signal(SIGALRM, alarm_signal); signal(SIGSEGV, crash_signal); srand(time(NULL)); for (i = 0; ; ++i) { now = time(NULL); strftime(timestr, sizeof(timestr), "%Y-%m-%dT%H:%M:%S", localtime(&now)); printf("%s - Iteration %i:\n", timestr, i); fuzz_test(dtype, MAX_FUZZ_LEN); } } return 0; }
// Run a single function, look at its outputs, and insert it into the correct place in the PartitionForest void insert_function(SgAsmFunction *func, InputValues &inputs, CloneDetection::PointerDetector &pointers, PartitionForest &partition, PartitionForest::Vertex *parent) { CloneDetection::Outputs<RSIM_SEMANTICS_VTYPE> *outputs = fuzz_test(func, inputs, pointers); OutputValues concrete_outputs = outputs->get_values(); partition.insert(func, concrete_outputs, parent); }