问题描述
我正在尝试获取指向每条指令的指针,据说可以通过以下方式实现:
Value* ptr = dyn_cast<Value>(&inst);
但是,我在使用 cmake 运行编译后的 C++ 程序时不断收到分段错误。在调试模式下,我收到以下错误消息:
opt-11: /usr/lib/llvm-11/include/llvm/IR/User.h:170: llvm::Value* llvm::User::getoperand(unsigned int)
const: Assertion `i < NumUserOperands && "getoperand() out of range!"' Failed.
Value *getoperand(unsigned i) const {
assert(i < NumUserOperands && "getoperand() out of range!");
return getoperandList()[i];
}
我向程序中从 getoperand()
获取的每个变量添加了空检查,但错误仍然存在。有谁知道它为什么会发生以及如何解决它?
解决方法
实际上,LLVM IR 中的一些指令只有一个操作数,用 inst.getOperand(1)
获取第二个操作数是没有意义的。因此有必要在继续之前检查操作数的数量:
for (auto& inst : bb) {
Value* v1;
Value* v2;
if (inst.getNumOperands() >= 1)
v1 = inst.getOperand(0);
if (inst.getNumOperands() == 2)
v2 = inst.getOperand(1);
}
或者干脆
for (auto& inst : bb) {
Value* v1 = inst.getOperand(0);
Value* v2;
if (inst.getNumOperands() == 2)
v2 = inst.getOperand(1);
}