我正在努力理解为什么下面的代码会产生分段错误。没有myMap [" 0"] = 53;程序运行得很好。看来当我尝试使用std :: map和std :: string作为键时,由于LLVM库中的一些冲突,程序将崩溃。但是,如果键类型是除string之外的任何其他数据类型,则程序将执行正常。
我的印象是,即使llvm库使用带有字符串键的std :: map,由于mapped_type不同,因此将生成非冲突的映射模板。那么这个错误怎么可能呢?
#include <string>
#include <iostream>
#include <IR/Module.h>
#include <IRReader/IRReader.h>
#include <Support/SourceMgr.h>
#include <IR/LLVMContext.h>
#include <memory>
#include <map>
using std::string;
using std::cout;
using std::endl;
using std::unique_ptr;
using llvm::Module;
using llvm::LLVMContext;
using llvm::SMDiagnostic;
std::map<std::string, int> myMap;
int main(int argc, char** argv)
{
myMap["0"] = 53; // With this line included the program will seg fault
string sFilePath = "varChange.ll";
LLVMContext &Context = llvm::getGlobalContext();
SMDiagnostic Err;
unique_ptr<Module> module = parseIRFile(sFilePath.c_str(), Err, Context);
cout << "Happily Exited" << endl;
return 0;
}
这是seg fault的valgrind输出:
Conditional jump or move depends on uninitialised value(s)
__memcmp_sse4_1 (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
std::string::compare(std::string const&) const (in /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.19)
bool std::operator< <char, std::char_traits<char>, std::allocator<char> >(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&) (basic_string.h:2571)
std::less<std::string>::operator()(std::string const&, std::string const&) const (stl_function.h:235)
std::_Rb_tree<std::string, std::pair<std::string const, std::string>, std::_Select1st<std::pair<std::string const, std::string> >, std::less<std::string>, std::allocator<std::pair<std::string const, std::string> > >::_M_lower_bound(std::_Rb_tree_node<std::pair<std::string const, std::string> >*, std::_Rb_tree_node<std::pair<std::string const, std::string> >*, std::string const&) (stl_tree.h:1141)
std::_Rb_tree<std::string, std::pair<std::string const, std::string>, std::_Select1st<std::pair<std::string const, std::string> >, std::less<std::string>, std::allocator<std::pair<std::string const, std::string> > >::lower_bound(std::string const&) (stl_tree.h:879)
std::map<std::string, std::string, std::less<std::string>, std::allocator<std::pair<std::string const, std::string> > >::lower_bound(std::string const&) (stl_map.h:864)
std::map<std::string, std::string, std::less<std::string>, std::allocator<std::pair<std::string const, std::string> > >::operator[](std::string&&) (stl_map.h:481)
llvm::AttrBuilder::addAttribute(llvm::StringRef, llvm::StringRef) (Attributes.cpp:1055)
llvm::LLParser::ParseFnAttributeValuePairs(llvm::AttrBuilder&, std::vector<unsigned int, std::allocator<unsigned int> >&, bool, llvm::SMLoc&) (LLParser.cpp:939)
llvm::LLParser::ParseUnnamedAttrGrp() (LLParser.cpp:882)
llvm::LLParser::ParseTopLevelEntities() (LLParser.cpp:245)
答案 0 :(得分:0)
我使用svn repo中的最新版本重新编译了我的llvm-clang库,问题似乎已得到解决。