我是llvm的初学者。我想在这里实现的是,一旦声明了变量,然后将其清理为随机值。例如,
#include <stdio.h>
#define enable_init 1
static const int len = 10;
void print(int* x, int len);
int main(int argc, char **argv){
int x[len];
print(x, len);
return 0;
}
void print(int* x, int len){
for(int i=0;i<len;i++){
printf("0x%08x \n",x[i]);
}
}
仪表后,
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
#include <string.h>
#define enable_init 1
static const int len = 10;
void print(int* x, int len);
void forceInit(void *ptr, size_t size);
int main(int argc, char **argv){
int x[len];
forceInit(x, sizeof(int) * len);
print(x, len);
return 0;
}
void print(int* x, int len){
for(int i=0;i<len;i++){
printf("0x%08x \n",x[i]);
}
}
void forceInit(void *ptr, size_t size){
srand(time(NULL));
for(size_t i=0;i<size;i++){
unsigned char r = (unsigned char)(rand() % 255);
memset(ptr+i,r,1);
}
}
这是我为此写的一个简单代码:
void visitAllocaInst(AllocaInst &I) {
IRBuilder<> IRB(I.getNextNode());
Value *toVar = IRB.CreatePointerCast(&I, IRB.getInt8PtrTy());
Value *deadbeef = IRB.getInt8(255);
IRB.CreateMemSet(toVar, deadbeef, Len, I.getAlignment());
}
当前版本只能将变量赋值给0xFF。我在IRBuilder的API中找到了CreateMemSet函数,但是我不知道如何处理rand()。