取消引用迭代器时出现段错误
Segfault when derefing iterator
我正在效仿 here。我的完整代码是
#include "llvm/IR/Function.h"
#include "llvm/Pass.h"
#include "llvm/IR/InstIterator.h"
using namespace llvm;
namespace {
struct Hello2 : public FunctionPass {
static char ID; // Pass identification, replacement for typeid
Hello2() : FunctionPass(ID) {}
bool runOnFunction(Function &F) override {
inst_iterator iter = inst_begin(F); // causes a segfault
return false;
}
};
}
char Hello2::ID = 0;
static RegisterPass<Hello2> Y("hello2", "Hello World Pass");
按照 "HelloWorld" 通过示例解释 here。当我完全按照示例操作时,它工作正常,但是使用上面修改过的密码,我在 运行 opt
时得到了段错误。
(我使用与 "HelloWorld" pass 示例中相同的 "hello.c" 文件作为输入,使用 clang 编译它,运行ning make
并使用 [=11 调用我的库=] 就像在示例中一样。)
是什么导致了我的段错误,有什么方法可以测试 it/avoid 吗?
编辑
我将段错误追溯到 InstIterator.h 的第 61 行:BI = BB->begin();
。当我的代码到达那个点时,BBs
是非 NULL,但 BB=BBs->begin()
是 NULL。因此,取消引用 BB
会导致段错误。 为什么 BB
是 NULL 的问题(以及为什么构造函数不检查它)仍然存在。
当我的系统自动更新并获得几个 llvm-3.5 软件包的新版本时(今天),这个问题得到了解决。以前,opt --version
返回
LLVM version 3.5
Optimized build.
Built Mar 23 2014 (21:41:30).
Default target: x86_64-pc-linux-gnu
Host CPU: corei7
现在 returns
LLVM version 3.5.0
Optimized build.
Built Jan 27 2015 (00:14:48).
Default target: x86_64-pc-linux-gnu
Host CPU: corei7
我正在效仿 here。我的完整代码是
#include "llvm/IR/Function.h"
#include "llvm/Pass.h"
#include "llvm/IR/InstIterator.h"
using namespace llvm;
namespace {
struct Hello2 : public FunctionPass {
static char ID; // Pass identification, replacement for typeid
Hello2() : FunctionPass(ID) {}
bool runOnFunction(Function &F) override {
inst_iterator iter = inst_begin(F); // causes a segfault
return false;
}
};
}
char Hello2::ID = 0;
static RegisterPass<Hello2> Y("hello2", "Hello World Pass");
按照 "HelloWorld" 通过示例解释 here。当我完全按照示例操作时,它工作正常,但是使用上面修改过的密码,我在 运行 opt
时得到了段错误。
(我使用与 "HelloWorld" pass 示例中相同的 "hello.c" 文件作为输入,使用 clang 编译它,运行ning make
并使用 [=11 调用我的库=] 就像在示例中一样。)
是什么导致了我的段错误,有什么方法可以测试 it/avoid 吗?
编辑
我将段错误追溯到 InstIterator.h 的第 61 行:BI = BB->begin();
。当我的代码到达那个点时,BBs
是非 NULL,但 BB=BBs->begin()
是 NULL。因此,取消引用 BB
会导致段错误。 为什么 BB
是 NULL 的问题(以及为什么构造函数不检查它)仍然存在。
当我的系统自动更新并获得几个 llvm-3.5 软件包的新版本时(今天),这个问题得到了解决。以前,opt --version
返回
LLVM version 3.5
Optimized build.
Built Mar 23 2014 (21:41:30).
Default target: x86_64-pc-linux-gnu
Host CPU: corei7
现在 returns
LLVM version 3.5.0
Optimized build.
Built Jan 27 2015 (00:14:48).
Default target: x86_64-pc-linux-gnu
Host CPU: corei7