我想编写一个LLVM Pass来对每个内存访问进行插桩。
这是我的工作内容。
对于任何C/C++程序(例如下面给出的程序),我正在尝试在每个读/写内存的指令之前和之后插入对某些函数的调用。例如,考虑下面的C ++程序(Account.cpp):
#include <stdio.h>
class Account {
int balance;
public:
Account(int b)
{
balance = b;
}
~Account(){ }
int read()
{
int r;
r = balance;
return r;
}
void deposit(int n)
{
balance = balance + n;
}
void withdraw(int n)
{
int r = read();
balance = r - n;
}
};
int main ()
{
Account* a = new Account(10);
a->deposit(1);
a->withdraw(2);
delete a;
}
因此,在进行仪器化之后,我的程序应该看起来像:
#include <stdio.h>
class Account
{
int balance;
public:
Account(int b)
{
balance = b;
}
~Account(){ }
int read()
{
int r;
foo();
r = balance;
foo();
return r;
}
void deposit(int n)
{
foo();
balance = balance + n;
foo();
}
void withdraw(int n)
{
foo();
int r = read();
foo();
foo();
balance = r - n;
foo();
}
};
int main ()
{
Account* a = new Account(10);
a->deposit(1);
a->withdraw(2);
delete a;
}
其中foo()可以是获取当前系统时间或者增加计数器等任何函数。
请给我提供示例(源代码、教程等)以及运行它的步骤。我已经阅读了http://llvm.org/docs/WritingAnLLVMPass.html上关于如何创建LLVM Pass的教程,但是无法弄清楚如何为上述问题编写一个Pass。
store
和load
可以访问内存。但当然应该排除本地变量的读/写(即由alloca
返回的指针,可能会被优化掉)。 - SK-logicbalance
变量不在堆栈上(哎呀!)。这仍然无法解释为什么要检测read()
函数(也许他想检测this
?)。 - Ze Blob