如何在LLVM中将Constant *转换为Value *?

时间:2017-06-19 04:17:48

标签: llvm

我只想混淆选择器名称,但我不知道如何将Constant *转换为Value *:

void symObfs(Module &M) {
            errs()<<"Start Obfuscating...\n";
            srand (time(NULL));
            //Objective-C Method ClassName Stuff
            for(auto G=M.getGlobalList().begin();G!=M.getGlobalList().end();G++){
                GlobalVariable &GL=*G;
                if (GL.getName().str().find("OBJC_METH_VAR_NAME_")==0||GL.getName().str().find("OBJC_CLASS_NAME_")==0){
                    ConstantDataArray* Initializer=dyn_cast<ConstantDataArray>(GL.getInitializer ());
                    // string newName = fakeNameGenerator();
                    string newName = randomString(16);
                    Constant *Value =ConstantDataArray::getString(Initializer->getContext(),newName,true);
                    //GL.setInitializer(Value);
                    errs()<<"Selector Name: "<<Initializer->getAsCString ()<<" Obfuscated to: "<<newName<<"\n";
                    Initializer->Value::replaceAllUsesWith(Value);
                }
            }
}

谢谢!

1 个答案:

答案 0 :(得分:2)

Constant类继承自Value类。

因此,您无需执行任何操作即可将Constant*转换为Value*。您可以直接将Constant*分配给Value*,因为在C ++中,子类对象的指针可以分配给父类指针变量。

另一方面,如果您要从Value*分配到Constant*,则必须使用dyn_cast作为

Constant * C = dyn_cast<Constant*>(V);

如果V中的对象确实不是常量,则将C设置为NULL