SIGBUS error from StringRef

I wrote a clang tool based on libtooling.
This tool will insert some code into the source file through Rewriter.

I encounted SIGBUS when insert a sentence after a SourceLocation.
I debugged using CLion and found this SIGBUS happend here:

Rewriter.cpp, Line 257 @Rewriter::InsertText(SourceLocation Loc, String Ref Str, bool InsertAfter, bool IndentNewLine)

the code writes:
while(isWhitespaceExceptNL(MB[i]) //the MB[i] will cause SIGBUS sometimes.

The MB is a instance of StringRef

I encounted this problem only for the main.c and utils.c from graph500-2.1.4, in the mpi folder.

when processing main.c, the problem happens when trying to insert a ‘\n’ after the for statement in line 45:
for(i=0;i<n;++i) tmp+=x[i];
-------------------^-----//try to insert here

can anyone tells me how to check the problem?

I used gcc4.8.4, Linux Mint 17.3, kernel version:3.13.0-24, core i7 4710M

here is my code:
(if I delete the code before


then the problem disappears)

bool StmtHandler::InsertText(Stmt *stmt, string toInsert) {
    //get rewriter from buffer
    SourceLocation slc = stmt->getLocStart();
    unsigned int fsl = TheContext.getFullLoc(slc).getSpellingColumnNumber();

    string filename = TheContext.getSourceManager().getFilename(slc).str();
    FileIdMap::iterator index = fileMap.find(filename);
    FileID id = TheRewriter.getSourceMgr().getFileID(slc);
    if(index == fileMap.end()){
        fileMap[filename] = id;
        //we need to judge whether the file was instrumented already
        const RewriteBuffer &buffer = TheRewriter.getEditBuffer(id);
        string content(buffer.begin(), buffer.end());
        size_t pos = content.find('\n', 0);
        string start = content.substr(0, pos + 1);
        string comp = "//instrumented "+namespace_origin+"\n";
        //if we can not write the file, we regard it as instrumented
        std::error_code OutErrorInfo;
        std::error_code ok;
        llvm::raw_fd_ostream tmpFile(filename, OutErrorInfo, llvm::sys::fs::F_RW);
        if(OutErrorInfo != ok){
            fileInstrumented[id] = true;
            return false;
        //see if this file was ever instrumented
        if(start != comp){
            fileInstrumented[id] = false;
            TheRewriter.InsertText(TheRewriter.getSourceMgr().getLocForStartOfFile(id), comp,false);
            fileInstrumented[id] = true;
            llvm::errs()<<"file "<<filename<<" was ignored.\n";
            return false;

            return false;

        SourceLocation ST = stmt->getLocStart();

        TheRewriter.InsertText(ST, "{\n", true, true);
        TheRewriter.InsertText(ST, toInsert + "\n", true, true);
        SourceLocation END = stmt->getLocEnd();
       int offset = Lexer::MeasureTokenLength(END,
                                               TheRewriter.getLangOpts()) + 1;

        SourceLocation END1 = END.getLocWithOffset(offset);
        TheRewriter.InsertText(END1, "\n}", true, true);
        CompoundStmt *compstmt = cast<CompoundStmt>(stmt);
        SourceLocation compLoc = compstmt->getLocStart();
        TheRewriter.InsertText(compLoc.getLocWithOffset(1),"\n"+toInsert+"\n", true, true);
    return true;

Shooting from the hip, it sounds like your StringRef is dangling (pointing to deallocated memory, etc). I’d suggest you try Valgrind to possibly get a better sense of what’s going on.