Я новичок в 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. Я нашел функцию CreateMemSet в API IRBuilder, но не знаю, что делать с rand ().