check pointer's validity. clean-up unused bits in parameter's value
This commit is contained in:
@@ -9,6 +9,7 @@
|
|||||||
#include <dwarf.h>
|
#include <dwarf.h>
|
||||||
#include <elfutils/libdw.h>
|
#include <elfutils/libdw.h>
|
||||||
|
|
||||||
|
#include "common.h"
|
||||||
#include "dwarf_utils.h"
|
#include "dwarf_utils.h"
|
||||||
#include "context.h"
|
#include "context.h"
|
||||||
#include "dwarf_parameter.h"
|
#include "dwarf_parameter.h"
|
||||||
@@ -166,6 +167,11 @@ void parameter_print(pst_parameter* param)
|
|||||||
|
|
||||||
if(param->info.flags & PARAM_HAS_VALUE) {
|
if(param->info.flags & PARAM_HAS_VALUE) {
|
||||||
param->ctx->print(param->ctx, "0x%lX", param->info.value);
|
param->ctx->print(param->ctx, "0x%lX", param->info.value);
|
||||||
|
|
||||||
|
// don't take care on NULL pointer since obviously it's invalid
|
||||||
|
if((param->info.flags & PARAM_INVALID) && param->info.value != 0) {
|
||||||
|
param->ctx->print(param->ctx, " <invalid>");
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
param->ctx->print(param->ctx, "<undefined>");
|
param->ctx->print(param->ctx, "<undefined>");
|
||||||
}
|
}
|
||||||
@@ -286,17 +292,16 @@ bool parameter_handle_type(pst_parameter* param, Dwarf_Die* result)
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
param->info.size = 64;
|
|
||||||
switch (dwarf_tag(&ret_die)) {
|
|
||||||
// base types
|
|
||||||
case DW_TAG_base_type: {
|
|
||||||
// get Size attribute and it's value
|
// get Size attribute and it's value
|
||||||
|
param->info.size = 8;
|
||||||
attr = dwarf_attr(&ret_die, DW_AT_byte_size, &attr_mem);
|
attr = dwarf_attr(&ret_die, DW_AT_byte_size, &attr_mem);
|
||||||
if(attr) {
|
if(attr) {
|
||||||
dwarf_formudata(attr, ¶m->info.size);
|
dwarf_formudata(attr, ¶m->info.size);
|
||||||
}
|
}
|
||||||
pst_log(SEVERITY_DEBUG, "%s: Base type '%s'(%lu)", __FUNCTION__, dwarf_diename(&ret_die), param->info.size);
|
|
||||||
|
|
||||||
|
switch (dwarf_tag(&ret_die)) {
|
||||||
|
// base types
|
||||||
|
case DW_TAG_base_type: {
|
||||||
const char* type_name = dwarf_diename(&ret_die);
|
const char* type_name = dwarf_diename(&ret_die);
|
||||||
attr = dwarf_attr(&ret_die, DW_AT_encoding, &attr_mem);
|
attr = dwarf_attr(&ret_die, DW_AT_encoding, &attr_mem);
|
||||||
if(attr) {
|
if(attr) {
|
||||||
@@ -379,6 +384,8 @@ bool parameter_handle_type(pst_parameter* param, Dwarf_Die* result)
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pst_log(SEVERITY_DEBUG, "%s: Parameter type '%s'(%lu) flags = 0x%X", __FUNCTION__, dwarf_diename(&ret_die), param->info.size, param->info.flags);
|
||||||
|
|
||||||
if(dwarf_hasattr(&ret_die, DW_AT_type)) {
|
if(dwarf_hasattr(&ret_die, DW_AT_type)) {
|
||||||
// handle parameter's sub-type
|
// handle parameter's sub-type
|
||||||
return parameter_handle_type(param, &ret_die);
|
return parameter_handle_type(param, &ret_die);
|
||||||
@@ -444,7 +451,15 @@ bool parameter_handle_dwarf(pst_parameter* param, Dwarf_Die* result, pst_functio
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//param->info.value &=0xFFFFFFFFFFFFFFFF >> (64 - ((param->info.size * 8) & 0x0F));
|
// check pointer validity
|
||||||
|
if((param->info.flags & (PARAM_TYPE_POINTER | PARAM_TYPE_FUNCPTR)) && pst_pointer_valid((void*)param->info.value)) {
|
||||||
|
param->info.flags |= PARAM_INVALID;
|
||||||
|
}
|
||||||
|
|
||||||
|
// clean-up unused bits in parameter's value
|
||||||
|
if(!(param->info.flags & (PARAM_TYPE_POINTER | PARAM_TYPE_FUNCPTR))) {
|
||||||
|
param->info.value &= 0xFFFFFFFFFFFFFFFF >> (64 - ((param->info.size * 8) & 0x3F));
|
||||||
|
}
|
||||||
|
|
||||||
// hack since DWARF has no ability to determine 'void' it another way
|
// hack since DWARF has no ability to determine 'void' it another way
|
||||||
if(!param->info.type_name) {
|
if(!param->info.type_name) {
|
||||||
|
|||||||
Reference in New Issue
Block a user