Skip to content

Commit

Permalink
Complete all implementations
Browse files Browse the repository at this point in the history
  • Loading branch information
SonicStark committed May 15, 2023
1 parent e170851 commit c6d40f4
Show file tree
Hide file tree
Showing 2 changed files with 125 additions and 50 deletions.
11 changes: 7 additions & 4 deletions include/sanitizer_symbolizer_tool.h
Original file line number Diff line number Diff line change
Expand Up @@ -5,13 +5,16 @@
extern "C" {
#endif

int SanSymTool_init(const char * external_symbolizer_path);
int SanSymTool_init(const char * external_symbolizer_path);
void SanSymTool_fini(void);

void SanSymTool_free(int free_target);
unsigned long SanSymTool_addr_send(char *module, unsigned int offset);
int SanSymTool_addr_read(unsigned long idx, char **file, char **function, unsigned long *line, unsigned long *column);
void SanSymTool_addr_free(void);

int SanSymTool_send(void);
int SanSymTool_recv(void);
int SanSymTool_data_send(char *module, unsigned int offset);
int SanSymTool_data_read(char **file, char **name, unsigned long *line, unsigned long *start, unsigned long *size);
void SanSymTool_data_free(void);

#ifdef __cplusplus
} // extern "C"
Expand Down
164 changes: 118 additions & 46 deletions lib/interface.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -21,13 +21,10 @@
#else
# define SANITIZER_INTERFACE_ATTRIBUTE __declspec(dllexport)
#endif
# define SANITIZER_WEAK_ATTRIBUTE
#elif SANITIZER_GO
# define SANITIZER_INTERFACE_ATTRIBUTE
# define SANITIZER_WEAK_ATTRIBUTE
#else
# define SANITIZER_INTERFACE_ATTRIBUTE __attribute__((visibility("default")))
# define SANITIZER_WEAK_ATTRIBUTE __attribute__((weak))
#endif


Expand All @@ -36,7 +33,7 @@ typedef enum
run_nothing,
run_llvm_symbolizer,
run_addr2line
} ToolCode ;
} ToolCode;

typedef enum
{
Expand All @@ -45,7 +42,7 @@ typedef enum
err_path_not_executable,
err_path_corrupted,
err_unsupported_tool
} RetCode ;
} RetCode;

static struct SANSYMTOOL_NS::DataInfo * pDataInfoBuf = nullptr;
static struct SANSYMTOOL_NS::AddrInfo * pAddrInfoBuf = nullptr;
Expand Down Expand Up @@ -90,6 +87,29 @@ int SanSymToolInit(const char * path) {
return (int) yes_init_done;
}

void SanSymToolFreeDataRes(void) {
if (pDataInfoBuf) {
if (pDataInfoBuf->file) {
std::free(pDataInfoBuf->file);
pDataInfoBuf->file = nullptr;
}
if (pDataInfoBuf->name) {
std::free(pDataInfoBuf->name);
pDataInfoBuf->name = nullptr;
}
}
}

void SanSymToolFreeAddrRes(void) {
if (pAddrInfoBuf) {
for (size_t i = 0; i < pAddrInfoBuf->frames.size(); ++i) {
struct SANSYMTOOL_NS::FrameDat * pframe = &(pAddrInfoBuf->frames[i]);
if (pframe->func) { std::free(pframe->func); }
if (pframe->file) { std::free(pframe->file); }
}
pAddrInfoBuf->frames.clear();
}
}

void SanSymToolFini(void) {
RunningThisTool = run_nothing;
Expand All @@ -100,62 +120,114 @@ void SanSymToolFini(void) {
pSanSymTool = nullptr;
}

SanSymToolFreeDataRes();
if (pDataInfoBuf) {
if (pDataInfoBuf->file) { std::free(pDataInfoBuf->file); }
if (pDataInfoBuf->name) { std::free(pDataInfoBuf->name); }
delete pDataInfoBuf;
pDataInfoBuf = nullptr;
}

SanSymToolFreeAddrRes();
if (pAddrInfoBuf) {
for (size_t i = 0; i < pAddrInfoBuf->frames.size(); ++i) {
struct SANSYMTOOL_NS::FrameDat * pframe = &(pAddrInfoBuf->frames[i]);
if (pframe->func) { std::free(pframe->func); }
if (pframe->file) { std::free(pframe->file); }
}
pAddrInfoBuf->frames.clear();
delete pAddrInfoBuf;
pAddrInfoBuf = nullptr;
}
}


void SanSymToolFreeDataRes(void) {
if (pDataInfoBuf) {
if (pDataInfoBuf->file) {
std::free(pDataInfoBuf->file);
pDataInfoBuf->file = nullptr;
}
if (pDataInfoBuf->name) {
std::free(pDataInfoBuf->name);
pDataInfoBuf->name = nullptr;
}
unsigned long SanSymToolSendAddrDat(char *module, unsigned int offset) {
if (!(pSanSymTool && pAddrInfoBuf)) { return 0; }

pAddrInfoBuf->module = module;
pAddrInfoBuf->module_offset = offset;
pAddrInfoBuf->module_arch = SANSYMTOOL_NS::kModuleArchUnknown;

if (pSanSymTool->SymbolizeAddr(pAddrInfoBuf)) {
return (unsigned long)(pAddrInfoBuf->frames).size();
} else {
return 0;
}
}
void SanSymToolFreeAddrRes(void) {
if (pAddrInfoBuf) {
for (size_t i = 0; i < pAddrInfoBuf->frames.size(); ++i) {
struct SANSYMTOOL_NS::FrameDat * pframe = &(pAddrInfoBuf->frames[i]);
if (pframe->func) { std::free(pframe->func); }
if (pframe->file) { std::free(pframe->file); }
}
pAddrInfoBuf->frames.clear();
}

int SanSymToolReadAddrDat(unsigned long idx, char **file, char **function, unsigned long *line, unsigned long *column) {
if (!(pAddrInfoBuf)) { return -1; }

if (idx >= (pAddrInfoBuf->frames).size()) { return -2; }

struct SANSYMTOOL_NS::FrameDat * pframe = &(pAddrInfoBuf->frames[idx]);
*file = pframe->file;
*function = pframe->func;
*line = pframe->lin;
*column = pframe->col;

return 0;
}
void SanSymToolFreeRes(int free_target) {
switch (free_target)
{
case 1:
SanSymToolFreeAddrRes();
break;
case 2:
SanSymToolFreeDataRes();
break;
default:
SanSymToolFreeAddrRes();
SanSymToolFreeDataRes();
break;

int SanSymToolSendDataDat(char *module, unsigned int offset) {
if (!(pSanSymTool && pDataInfoBuf)) { return -1; }

pDataInfoBuf->module = module;
pDataInfoBuf->module_offset = offset;
pDataInfoBuf->module_arch = SANSYMTOOL_NS::kModuleArchUnknown;

if (pSanSymTool->SymbolizeData(pDataInfoBuf)) {
return 0;
} else {
return -2;
}
}

int SanSymToolReadDataDat(char **file, char **name, unsigned long *line, unsigned long *start, unsigned long *size) {
if (!(pDataInfoBuf)) { return -1; }

*file = pDataInfoBuf->file;
*name = pDataInfoBuf->name;
*line = pDataInfoBuf->line;
*start = pDataInfoBuf->start;
*size = pDataInfoBuf->size;

return 0;
}


extern "C" {

SANITIZER_INTERFACE_ATTRIBUTE
int SanSymTool_init(const char * external_symbolizer_path) {
return SanSymToolInit(external_symbolizer_path);
}

SANITIZER_INTERFACE_ATTRIBUTE
void SanSymTool_fini(void) {
SanSymToolFini();
}

SANITIZER_INTERFACE_ATTRIBUTE
unsigned long SanSymTool_addr_send(char *module, unsigned int offset) {
return SanSymToolSendAddrDat(module, offset);
}

SANITIZER_INTERFACE_ATTRIBUTE
int SanSymTool_addr_read(unsigned long idx, char **file, char **function, unsigned long *line, unsigned long *column) {
return SanSymToolReadAddrDat(idx, file, function, line, column);
}

SANITIZER_INTERFACE_ATTRIBUTE
void SanSymTool_addr_free(void) {
SanSymToolFreeAddrRes();
}

SANITIZER_INTERFACE_ATTRIBUTE
int SanSymTool_data_send(char *module, unsigned int offset) {
return SanSymToolSendDataDat(module, offset);
}

SANITIZER_INTERFACE_ATTRIBUTE
int SanSymTool_data_read(char **file, char **name, unsigned long *line, unsigned long *start, unsigned long *size) {
return SanSymToolReadDataDat(file, name, line, start, size);
}

SANITIZER_INTERFACE_ATTRIBUTE
void SanSymTool_data_free(void) {
SanSymToolFreeDataRes();
}

} // extern "C"

0 comments on commit c6d40f4

Please sign in to comment.