glibc обнаружил повреждение памяти

У меня есть следующая функция.

129 string cmdline::compile_sOpt(const cl_option *options)
130 {
131    assert(options != MEM0x0);
132 
133    string sOpt;
134    int i =0;
135    while(options[i].lo_name != MEM0x0){
136       sOpt += options[i].so_name;
137       if(options[i].has_arg == required_argument ||
138          options[i].has_arg == optional_argument)
139             sOpt += GC_GETOPT_ARG;
140       ++i;
141    }
142 
143    return sOpt;
144 }

При возврате этой функции возникает следующая ошибка.

*** glibc detected *** ./a.out: malloc(): memory corruption: 0x000000000133c1a0 ***

Я прокомментировал весь код и написал следующее, но ошибка все еще сохраняется.

string s;
return s;

so_name и GC_GETOPT_ARG оба являются const char. В gdb sOpt никогда не имеет значения.

Заранее спасибо.

РЕДАКТИРОВАТЬ: Спасибо за указатели. Я понял ошибку, и мне стыдно сказать, что я сделал это. Но ошибка была memset вне конца массива.


person Thomas    schedule 19.03.2011    source источник
comment
Если вы можете закомментировать весь код, а ошибка все еще присутствует, значит, куча повреждена до того, как вы вызовете эту функцию. Начните смотреть на звонящего.   -  person    schedule 19.03.2011
comment
Я предполагаю, что MEM0x0 определяется как NULL AKA 0?   -  person user470379    schedule 19.03.2011
comment
И гарантированно ли вы найдете варианты с lo_name равным MEM0x0?   -  person user470379    schedule 19.03.2011


Ответы (1)


Вероятно, вы испортили стек или кучу. Ошибка предполагает, что это, скорее всего, куча, но нет гарантии, что повреждение стека не является причиной. Повреждение происходит до вызова этой функции.

Обновление0

memset с конца массива

Это классический случай повреждения, который может вызвать это, я подозреваю, что вы сделали это с регионом в куче, который его испортил. Следующий вызов malloc или free приведет к завершению программы при обнаружении проблемы.

person Matt Joiner    schedule 19.03.2011