我的程序是一個非常令人費解的方式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
試試這個:'如果(節點名稱){dataL.name =的std :: string(節點名稱); }' – erip
如果您嘗試以其他方式訪問'nodeName',您可能會得到相同的段錯誤。爲什麼你會使用valgrind呢? –
你是否在編譯時將警告視爲錯誤?我懷疑堆棧損壞(警告將幫助您找到堆棧損壞,所以應該valgrind ...但是meh) – user1708860