C++ STL地图<;字符串,>;与LLVM库冲突

C++ STL地图<;字符串,>;与LLVM库冲突,c++,string,c++11,stl,llvm,C++,String,C++11,Stl,Llvm,我很难理解为什么下面的代码会产生分段错误。没有myMap[“0”]=53;这个程序运行得很好。当我尝试使用std::map和std::string作为键时,程序似乎会由于LLVM库中的一些冲突而崩溃。但是,如果键类型是字符串以外的任何其他数据类型,则程序将正常执行 我的印象是,即使llvm库使用带有字符串键的std::map,由于映射的类型不同,也会生成一个不冲突的映射模板。那么这个错误怎么可能呢 #include <string> #include <iostream&

我很难理解为什么下面的代码会产生分段错误。没有myMap[“0”]=53;这个程序运行得很好。当我尝试使用std::map和std::string作为键时,程序似乎会由于LLVM库中的一些冲突而崩溃。但是,如果键类型是字符串以外的任何其他数据类型,则程序将正常执行

我的印象是,即使llvm库使用带有字符串键的std::map,由于映射的类型不同,也会生成一个不冲突的映射模板。那么这个错误怎么可能呢

#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;
 }
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
使用std::string;
使用std::cout;
使用std::endl;
使用std::unique\u ptr;
使用llvm::Module;
使用llvm::LLVMContext;
使用llvm::SMDiagnostic;
std::map myMap;
int main(int argc,字符**argv)
{
myMap[“0”]=53;//包含此行后,程序将seg fault
字符串sFilePath=“varChange.ll”;
LLVMContext&Context=llvm::getGlobalContext();
SMR诊断错误;
unique_ptr module=parseIRFile(sFilePath.c_str(),Err,Context);

我可以使用svn repo中的最新版本重新编译我的llvm clang库,问题似乎得到了解决。

为什么这个
std::map myMap;
需要是一个全局变量?如果你只是在main中有映射的代码,你仍然segfault吗?它不需要是全局的,这只是我创建之后的一个示例片段我在一段更大的代码中发现了冲突。在映射成为类中的数据成员之前。如果我删除parseIRFile行而不是myMap[“0”]=53;程序将正确执行。我怀疑代码中潜藏着另一个内存错误,但如果没有那一行,它只是碰巧丢弃了从未使用过的内存。您是否尝试在没有那一行的情况下运行valgrind?@LPierce Divide and Concurve。删除除标准#include Header之外的所有代码。从
main
除了映射声明。代码现在是否运行?如果是,请慢慢添加代码,直到出现问题。
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)