STL Map <string,>与LLVM库冲突</string,>

时间:2015-04-13 17:21:40

标签: c++ string c++11 stl llvm

我正在努力理解为什么下面的代码会产生分段错误。没有myMap [&#34; 0&#34;] = 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)  

1 个答案:

答案 0 :(得分:0)

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