c++ - 获取指令指针时发生 LLVM 断言错误
问题描述
我正在尝试获取指向每条指令的指针,据说可以通过以下方式实现:
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.
在LLVM doc中,这是指向断言源的代码块:
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);
}
推荐阅读
- java - JAVA 8 要从列表分配给对象的内存/集合/列表值
- php - 嵌入式网站如何分辨谁在嵌入它?
- javascript - 动态绘制吉他和弦
- html - 背景模糊但保留表格 CSS 中的文本颜色
- android - 超级账本客户端
- kubernetes - 如何使用 python API 以编程方式从 GCP 服务帐户生成 kubernetes 配置
- java - JavaFX11 的 javafx.stage.Stage 版本无效
- django - 如何更新字段实例的选择选项,而不是整个字段?
- arrays - 如何从数组中填充选择器反应本机
- ios - 将 iOS 应用程序连接到蓝牙设备而不是 BLE