2015-11-10 63 views
0

我的程序是一個非常令人費解的方式segfaulting。它發生在std :: string庫代碼中,所以我假設我的程序覆蓋了其他地方的std :: string代碼。的段錯誤發生時,我試圖分配一個char *爲std:串中的自動變量:Valgrind無法找到無效的寫

struct MyStruct 
{ 
    std::string name; 
    int winch_ndx; 
    ... 
}; 

void MyFunction(const char * nodeName) 
{ 
    MyStruct dataL; 
    dataL.name = nodeName; <-- segfault 
    ... 
} 

由於DATAL是一個自動可變的,代碼的其它部分不能覆蓋它所佔用的內存,所以我猜這個庫代碼本身正被覆蓋值0x6C2FD8(見下文)。令人費解的是,Valgrind根本沒有發現原始的無效寫入。我不知道這個0x6C2FD8可以被引入到std :: string代碼中。任何洞察力將不勝感激。

Valgrid輸出和我的valgrind命令如下。

== 17112 ==過程與信號的默認動作11(SIGSEGV)結束

== 17112 ==用於映射區域爲權限在地址0x6C2FD8

==在0x9B07D87 17112 == :__exchange_and_add(atomicity.h:47)

== 17112 ==由0x9B07D87:__exchange_and_add_dispatch(atomicity.h:80)

== 17112 ==由0x9B07D87:的std :: string :: _代表:: _M_dispose(STD :: ALLOC ATOR常量&)克隆.part.12](basic_string.h:246)

== 17112 ==由0x9B07F78:_M_dispose(char_traits.h:243)

== 17112 ==由0x9B07F78: std :: string :: _ M_mutate(unsigned long,unsigned long,unsigned long)(basic_string.tcc:487)

== 17112 == by 0x9B083ED:std :: string :: _ M_replace_safe(unsigned long,unsigned long, char const *,unsigned long)(basic_string.tcc:684)

== 17112 == by 0x613ADA:MyFunction(comm.cpp:1108)

valgrind --gen-suppressions=all --error-markers=BEGIN_MARK,END_MARK --free-fill=FF --malloc-fill=FF --trace-malloc=yes --trace-children=yes --track-origins=yes --read-var-info=yes --partial-loads-ok=no --log-file=vg2.out my_program 
+1

試試這個:'如果(節點名稱){dataL.name =的std :: string(節點名稱); }' – erip

+0

如果您嘗試以其他方式訪問'nodeName',您可能會得到相同的段錯誤。爲什麼你會使用valgrind呢? –

+0

你是否在編譯時將警告視爲錯誤?我懷疑堆棧損壞(警告將幫助您找到堆棧損壞,所以應該valgrind ...但是meh) – user1708860

回答

3

爲是NULL檢查節點名稱,還要檢查節點名稱實際上指向一個 '\ 0' 結尾的字符串...

+0

nodeName不是NULL幷包含有效的以null結尾的字符串。 – Kurt

+0

@Kurt嘗試隔離問題。你能發佈一個最小可重現的例子嗎? – mzu