Skip to content
Snippets Groups Projects

Compare revisions

Changes are shown as if the source revision was being merged into the target revision. Learn more about comparing revisions.

Source

Select target project
No results found

Target

Select target project
  • opensrc/SMPStaticAnalyzer
1 result
Show changes
Commits on Source (2)
......@@ -16812,6 +16812,13 @@ void SMPFunction::Dump(void) {
SMP_msg("Debug dump for function: %s\n", this->GetFuncName());
SMP_msg("UseFP: %d LocalVarsAllocInstr: %llx Block: %d\n", this->UseFP,
(uint64_t) this->LocalVarsAllocInstr, this->GetBlockFromInstAddr(this->LocalVarsAllocInstr)->GetNumber());
if (!this->ReturnTargets.empty()) {
SMP_msg("Return targets: ");
for (STARS_ea_t RetTargetAddr : this->ReturnTargets) {
SMP_msg("%llx ", (uint64_t) RetTargetAddr);
}
SMP_msg("\n");
}
for (std::size_t index = 0; index < this->IDom.size(); ++index) {
SMP_msg("IDOM for %zu: %d\n", index, this->IDom.at(index));
}
......
......@@ -4980,11 +4980,13 @@ bool SMPInstr::HasSourceMemoryOperand(void) const {
} // end of SMPInstr::HasSourceMemoryOperand()
 
bool SMPInstr::HasStaticMemWrite(void) const {
return ((nullptr != this->DEFMemOp) && (this->DEFMemOp->IsStaticMemOp()));
return ((nullptr != this->DEFMemOp)
&& (this->DEFMemOp->IsStaticMemOp() || IsImmedGlobalAddress(this->DEFMemOp->GetAddr())));
}
 
bool SMPInstr::HasStaticMemRead(void) const {
return ((nullptr != this->USEMemOp) && (this->USEMemOp->IsStaticMemOp()));
return ((nullptr != this->USEMemOp)
&& (this->USEMemOp->IsStaticMemOp() || IsImmedGlobalAddress(this->USEMemOp->GetAddr())));
}
 
int SMPInstr::GetOptType(void) const {
......@@ -5238,7 +5240,7 @@ void SMPInstr::AnalyzeIndirectRefs(bool UseFP) {
this->GetBlock()->SetHasIndirectMemWrite();
}
}
if (DefMemOp->IsStaticMemOp()) {
if (this->HasStaticMemWrite()) {
if (HasBlock) {
this->GetBlock()->SetHasStaticMemWrite();
}
......@@ -5254,7 +5256,7 @@ void SMPInstr::AnalyzeIndirectRefs(bool UseFP) {
this->GetBlock()->SetHasIndirectMemRead();
}
}
if (UseMemOp->IsStaticMemOp()) {
if (this->HasStaticMemRead()) {
STARS_ea_t AddrOffset = USEMemOp->GetAddr();
if (!IsImmedGlobalAddress(AddrOffset) && (STARS_x86_R_none == UseMemOp->GetSegReg())) {
SMP_msg("INFO: Doubtful identification of %llx as StaticMem at %llx\n",
......@@ -2296,7 +2296,7 @@ STARS_ea_t STARS_IRDB_Instruction_t::GetFallThroughInstID(void) {
assert(nullptr != irdb_inst);
libIRDB::Instruction_t* FallThroughInst = irdb_inst->GetFallthrough();
if (nullptr != FallThroughInst) {
FallThroughID = (STARS_ea_t) FallThroughInst->GetAddress()->GetVirtualOffset();
FallThroughID = (STARS_ea_t) FallThroughInst->GetAddress()->GetBaseID();
}
return FallThroughID;
}
......@@ -203,7 +203,12 @@ no operands for eflags or mxcsr?
{
assert(length!=0);// we need the length in this case.
operand.mem.disp=the_arg.getMemoryDisplacement(); // the_arg.Memory.Displacement+length;
#if 1
// Imitate IDA Pro: IP-relative static memop is relative to CS segment register.
this->SegReg = STARS_x86_R_cs;
#else
operand.mem.base=STARS_x86_R_ip;
#endif
}
else
{
......
......@@ -104,12 +104,12 @@ bool MDIsIndexedAccess(STARS_ea_t InstAddr, STARS_ea_t GlobalAddr) {
// Determine static global variable boundaries.
void STARS_IRDB_Program_t::InitStaticDataTable(SMPProgram *CurrProg) {
#if 0
char buf[STARS_MAXSTR];
#if 1
// On the IDA Pro interface, see STARS_IDA_Program_t::InitStaticDataTable()
// for the work done. On the IRDB interface, perhaps we only need the lowest
// and highest static data addresses.
STARS_ea_t ea;
flags_t ObjFlags;
bool ReadOnlyFlag;
size_t DummyNumber = 0; // suffix for SMP_dummy# global names
// First, examine the data segments and collect info about static
// data, such as name/address/size.
......@@ -121,22 +121,13 @@ void STARS_IRDB_Program_t::InitStaticDataTable(SMPProgram *CurrProg) {
// Loop through all segments.
STARS_ea_t RecentAddr = STARS_BADADDR;
for (STARS_Segment_t *seg = SMP_get_first_seg(); NULL != seg; seg = SMP_get_next_seg(RecentAddr)) {
for (STARS_Segment_t *seg = SMP_get_first_seg(); nullptr != seg; seg = SMP_get_next_seg(RecentAddr)) {
char SegName[STARS_MAXSTR];
RecentAddr = seg->get_startEA();
STARS_ssize_t SegNameSize = SMP_get_segm_name(seg, SegName, sizeof(SegName) - 1);
// We are only interested in the data segments of type
// SEG_DATA, SEG_BSS and SEG_COMM.
#if SMP_DEBUG
SMP_msg("Found segment of type <elided>" /*, seg->type */);
if (SegNameSize > 0)
SMP_msg(" SegName: %s", SegName);
SMP_msg(" from %lx to %lx\n", (unsigned long)seg->get_startEA(), (unsigned long)seg->get_endEA());
if (ReadOnlyFlag) {
SMP_msg("Read-only segment.\n");
}
#endif
if ((seg->IsDataSegment()) || (seg->IsBSSSegment()) || (seg->IsCommonSegment())) {
// Loop through each of the segments we are interested in,
// examining all data objects (effective addresses).
......@@ -151,100 +142,12 @@ void STARS_IRDB_Program_t::InitStaticDataTable(SMPProgram *CurrProg) {
}
#endif
ea = seg->get_startEA();
while (ea < seg->get_endEA()) {
ObjFlags = SMP_get_flags_novalue(ea);
// Only process head bytes of data objects, i.e. isData().
if (isData(ObjFlags)) {
// Compute the size of the data object.
STARS_ea_t NextEA = SMP_next_head(ea, seg->get_endEA());
if (NextEA == BADADDR) {
NextEA = seg->get_endEA();
}
size_t ObjSize = (size_t) (NextEA - ea);
if (TempLowestGlobalVarAddress > ea)
TempLowestGlobalVarAddress = ea;
if (TempHighestGlobalVarAddress < NextEA)
TempHighestGlobalVarAddress = NextEA - 1;
// Get the data object name using its address.
char *TrueName = SMP_get_true_name(BADADDR, ea, buf, sizeof(buf));
if (NULL == TrueName) {
int count = SMP_snprintf(buf, sizeof(buf), "SMP_dummy%zu", DummyNumber);
++DummyNumber;
TrueName = buf;
}
// Record the name, address, size, and type info.
struct GlobalVar VarTemp;
VarTemp.addr = ea;
VarTemp.size = ObjSize;
VarTemp.ReadOnly = ReadOnlyFlag;
VarTemp.IndexedAccess = false;
VarTemp.flags = ObjFlags;
SMP_strncpy(VarTemp.name, buf, sizeof(VarTemp.name) - 1);
// Insert name and address into name-addr map if it is
// not an SMP_dummy0 variable.
if (NULL != TrueName) {
string bufstring(buf);
pair<string, STARS_ea_t> TempPair(bufstring, ea);
pair<map<string, STARS_ea_t>::iterator, bool> InsertResult;
InsertResult = CurrProg->InsertGlobalNameAddrMapEntry(TempPair);
if (!InsertResult.second) {
SMP_msg("FATAL ERROR: Insertion into GlobalNameMap: %s at %llu\n", buf, ea);
}
assert(InsertResult.second);
}
VarTemp.FieldOffsets.clear();
#if SMP_COMPUTE_GLOBAL_GRANULARITY
if (VarTemp.size < 1000000) { // don't waste time on monster objects
this->ComputeGlobalFieldOffsets(VarTemp);
}
#endif
pair<STARS_ea_t, struct GlobalVar> TempItem(ea, VarTemp);
CurrProg->InsertGlobalVarTableEntry(TempItem);
STARS_ea_t NextEA = seg->get_endEA();
if (TempLowestGlobalVarAddress > ea)
TempLowestGlobalVarAddress = ea;
if (TempHighestGlobalVarAddress < NextEA)
TempHighestGlobalVarAddress = NextEA - 1;
// Check for code xrefs from the data.
// Can have a table of pointers, so iterate through large data objects.
STARS_ea_t TempAddr = ea;
while ((NextEA - TempAddr) >= MD_DEFAULT_RETURN_ADDRESS_SIZE) {
SMP_xref_t xrefs;
for (bool ok = xrefs.SMP_first_from(TempAddr, XREF_DATA); ok; ok = xrefs.SMP_next_from()) {
STARS_ea_t TargetAddr = xrefs.GetTo();
if ((TargetAddr != 0) && (!xrefs.GetIscode())) {
// Found a target, with its address in xrefs.to
// Is the target code?
STARS_Segment_t *SegInfo = SMP_getseg(TargetAddr);
if ((NULL != SegInfo) && (SegInfo->IsCodeSegment())) {
bool NewTarget = CurrProg->InsertDataToCodeXref(TargetAddr);
if (NewTarget)
global_STARS_program->PrintDataToCodeXref(TempAddr, TargetAddr, 0);
}
}
}
#ifdef __EA64__
uint64_t DataValue = get_qword(TempAddr);
#else
uint32_t DataValue = get_long(TempAddr);
#endif
if (DataValue != 0) {
// Is this a code address?
STARS_ea_t PossibleCodeAddr = (STARS_ea_t) DataValue;
STARS_Segment_t *SegInfo = SMP_getseg(PossibleCodeAddr);
if ((NULL != SegInfo) && (SegInfo->IsCodeSegment())) {
bool NewTarget = CurrProg->InsertDataToCodeXref(PossibleCodeAddr);
if (NewTarget)
global_STARS_program->PrintDataToCodeXref(TempAddr, PossibleCodeAddr, 0);
}
}
TempAddr += MD_DEFAULT_RETURN_ADDRESS_SIZE;
}
// Move on to next data object
ea = NextEA;
}
else {
ea = nextaddr(ea);
}
} // end while (ea < seg->endEA)
} // end if (seg->type == SEG_DATA ...)
else if (seg->IsCodeSegment()) {
if (seg->get_startEA() < TempLowestCodeAddress)
......@@ -252,16 +155,7 @@ void STARS_IRDB_Program_t::InitStaticDataTable(SMPProgram *CurrProg) {
if (seg->get_endEA() > TempHighestCodeAddress)
TempHighestCodeAddress = seg->get_endEA() - 1;
} // end else if (seg->type === SEG_CODE)
else {
#if SMP_DEBUG
SMP_msg("Not processing segment of type <elided> SegName: %s from %lx to %lx\n",
/*seg->type,*/ SegName, (unsigned long)seg->get_startEA(), (unsigned long)seg->get_endEA());
#endif
}
} // end for all segments
#if SMP_COUNT_MEMORY_ALLOCATIONS
SMPGlobalVarCount += this->GlobalVarTable.size();
#endif
// Update SMPProgram global limits
if (LowestCodeAddress > TempLowestCodeAddress) {
......