windows-binary-fuzzing/transforms/initialize_stack.hpp
2025-02-26 18:48:49 +01:00

62 lines
2.1 KiB
C++
Executable File

#pragma once
#include <irdb-core>
#include <irdb-transform>
//
// Put the transform in its own namespace
// just to keep the header files easy to read.
// This is not an IRDB transform requirement, just good coding practice.
//
namespace InitStack {
using namespace std;
using namespace IRDB_SDK;
//
// This class handles initializing stack frames to a constant value
//
// Note: Using private inheritence here for "principle of minimum access",
// but you can choose what's best for your needs.
//
class InitStack_t : private Transform_t {
public:
// construct an object
InitStack_t(
FileIR_t *p_variantIR, // the FileIR object to transform
const string &p_function_filename, // the name of a file with functions to
// transform. "" -> no file and
// transform all functions
int init_value = 0, // the value to write when initializing the stack
bool p_verbose = false // use verbose logging?
);
// execute the transform
// input: m_funcs_to_init the set of functions to transform, the fileIR to
// transform output: the transformed fileIR, with extra instructions to init
// stack frames return value: true -> success, false -> fail
bool execute();
private:
// methods
// read in the given file full of function names to transform (called from
// constructor) input: the filename and FileIR to transform output:
// m_funcs_to_init with the functions listed in the file
void readFunctionsFromFile(const string &p_filename);
// initialize the stack for a given function
// input: the fileIR to transform
// output: the transformed fileIR
void initStack(Function_t *f);
// data
set<Function_t *> m_funcs_to_init; // the functions whose stacks this object
// should initialize
int m_init_value; // the value with which to init the stack.
bool m_verbose; // do verbose logging
int m_num_transformed; // stats about how many functions that this object has
// transformed
};
} // namespace InitStack