我刚刚读到了LLVM项目,它可以用来使用LLVM前端的分析器Clang对C/C++代码进行静态分析.我想知道是否可以使用LLVM提取源代码中对内存的所有访问(变量,本地和全局).
LLVM中是否存在任何内置库,我可以使用它来提取此信息.如果不是,请建议我如何编写函数来做同样的事情.(现有的源代码,参考,教程,示例...)我想到的是,我首先将源代码转换为LLVM bc,然后将其设置为做分析,但不知道如何做到这一点.
我试图找出自己应该使用哪种IR(Clang的抽象语法树(AST)或LLVM的SSA中间表示(IR).),但无法确定要使用哪一个.这是我想要做的.给定任何C/C++程序(如下面给出的那样),我试图在每个读/写内存的指令之前和之后插入一些函数的调用.例如,考虑下面的C++程序(Account.cpp)
#include <stdio.h>
class Account {
int balance;
public:
Account(int b) {
balance = b;
}
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;
}
Run Code Online (Sandbox Code Playgroud)
所以在仪器之后我的程序应该是这样的:
#include <stdio.h>
class Account {
int balance;
public:
Account(int b) …Run Code Online (Sandbox Code Playgroud) 我想写一个LLVM传递来检测每个内存访问.这是我想要做的.
给定任何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;
}
Run Code Online (Sandbox Code Playgroud)
所以在仪器之后我的程序应该是这样的:
#include <stdio.h>
class Account
{
int balance;
public:
Account(int b) …Run Code Online (Sandbox Code Playgroud) 我试图使用"\ copy"命令从php导入txt/csv文件到我的postgres数据库.我不能使用COPY而不是\ copy,因为我需要它作为psql客户端执行.我的代码是:
$query = '\\'.'copy data1 FROM "data1.txt" WITH CSV HEADER DELIMITER AS "," QUOTE AS "^"';
$result = pg_query($conn,$query);
if (!$result) {
echo "cannot copy data\n";
} else {
echo "SUCCESS!";
}
Run Code Online (Sandbox Code Playgroud)
当我运行这个PHP文件时,我收到此错误:
PHP Warning: pg_query(): Query failed: ERROR: syntax error at or near "\"
LINE 1: \copy data1 FROM "data1.txt" WITH ...
^ in script.php on line 30
Run Code Online (Sandbox Code Playgroud)