英特尔PIN手册(“内存引用跟踪”部分)说:


我们还使用INS_InsertPredicatedCall而不是INS_InsertCall
避免生成对在
谓词为假,请参见此处。




如果要分析所有实际执行的指令,我应该选择哪两个?我不确定,因为我经常看到INS_InsertPredicatedCall。但是,为什么有人要使用它,即为什么有人要分析谓词为假的谓词


?也许这两个函数如何导致不同结果的一个最小示例在这里会有所帮助...

#1 楼

您是正确的,在您的情况下,我们应该使用INS_InsertPredicatedCall而不是INS_InsertCall。区分彼此很直观,请考虑以下代码

cond:
  xor eax, eax
  mov edx, 0x1
  cmp word [esp + 0x4], 0x5
  cmovz eax, edx
  ret


C代码有点像>
如果使用INS_InsertCall跟踪cond(input)的已执行指令,那么对于input的任何值,都将始终观察到跟踪: INS_InsertPredicateCall,然后对于input != 0x5,您将只能观察到: