c++ - 为什么 ret 指令数大于调用指令数?

标签 c++ operating-system cpu-architecture intel-pin

我写了一个pintool。它在执行指令时为程序实现堆栈。如果遇到调用指令,它会将下一条指令的地址按顺序压入堆栈。当被调用过程完成并遇到返回指令时,它会验证 ret 指令中的目标地址是否等于堆栈顶部并弹出顶部。

通常调用指令的数量应该等于返回指令的数量。但是这个工具会监控大量的返回指令。这怎么可能?问题是什么?我该如何解决?

编辑 1:

pintool 代码

VOID f_jump(int a, int b) 
{ 
s.push(b); 
cout<<s.top()<<"\t"; 
icount1++; 
}
VOID f_ret(int a, int b) 
{ 
if (b==s.top())
 { 
   cout<<s.top(); 
   s.pop(); 
   cout<<"\tOK"<<endl; 
 }
else 
cout<<"Exploit\t"<<endl<<s.top()<<"\t"<<b<<endl; 
icount2++; 
} 

VOID Instruction(INS ins, VOID *v) 
{ 
if( INS_IsCall(ins) ) 
  { 
  INS_InsertCall(ins,IPOINT_TAKEN_BRANCH,AFUNPTR(f_jump),
  IARG_BRANCH_TARGET_ADDR,IARG_RETURN_IP, IARG_END); 
  } 
if( INS_IsRet(ins) )
  { 
 INS_InsertCall(ins,IPOINT_BEFORE,AFUNPTR(f_ret),
 IARG_INST_PTR,IARG_BRANCH_TARGET_ADDR, IARG_END);
  } 
}

我在各种二进制文件和进程上运行它,但问题仍然存在。请帮忙。

最佳答案

您可以在函数调用中出现 longjmp、C++ 异常或退出调用,这会使您错过该函数调用的返回指令。

这个已经讨论过很多次了here

关于c++ - 为什么 ret 指令数大于调用指令数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45331926/

相关文章:

c++ - 使用哪种数据结构来查找元素

c++ - 如何在不在主程序流程中调用的情况下填充全局变量?

c++ - CMake check_function_exists 没有

c++ - 花哨的指针是什么样子的?

operating-system - 电源故障中断究竟发生了什么?

rust - 使用 Rust 裸机显示的输出

linux - 当 linux 系统调用被阻塞时如何以及何时设置 -EINTR

c - L2 高速缓存行未命中计数

assembly - 指令流水线与每个指令的周期之间的链接

assembly - 现代 CPU 与 GPU 可以完成多少级流水线?