Я довольно неопытен в использовании C ++, но я пытаюсь скомпилировать версию 2.0.2 SBML toolbox для matlab на 64-битной платформе XP. Набор инструментов SBML зависит от Xerces 2.8 и libsbml 2.3.5.
Мне удалось собрать и скомпилировать набор инструментов на 32-разрядной машине, и он работает, когда я тестирую его. Однако после его перекомпоновки на 64-битной машине (это ОГРОМНАЯ ПИТА!) Я получаю ошибку сегментации, когда пытаюсь читать с нее длинные XML-файлы.
Я подозреваю, что проблема вызвана указателем проблем с адресами .
Трассировка стека от ошибки сегментации начинается с:
[ 0] 000000003CB3856E libsbml.dll+165230 (StringBuffer_append+000030)
[ 6] 000000003CB1BFAF libsbml.dll+049071 (EventAssignment_createWith+001631)
[ 12] 000000003CB1C1D7 libsbml.dll+049623 (SBML_formulaToString+000039)
[ 18] 000000003CB2C154 libsbml.dll+115028 (
Итак, я смотрю на функцию StringBuffer_append в коде libsbml:
LIBSBML_EXTERN
void
StringBuffer_append (StringBuffer_t *sb, const char *s)
{
unsigned long len = strlen(s);
StringBuffer_ensureCapacity(sb, len);
strncpy(sb->buffer + sb->length, s, len + 1);
sb->length += len;
}
Обеспечить емкость выглядит следующим образом:
LIBSBML_EXTERN
void
StringBuffer_ensureCapacity (StringBuffer_t *sb, unsigned long n)
{
unsigned long wanted = sb->length + n;
unsigned long c;
if (wanted > sb->capacity)
{
/**
* Double the total new capacity (c) until it is greater-than wanted.
* Grow StringBuffer by this amount minus the current capacity.
*/
for (c = 2 * sb->capacity; c < wanted; c *= 2) ;
StringBuffer_grow(sb, c - sb->capacity);
}
}
и StringBuffer_grow выглядит так:
LIBSBML_EXTERN
void
StringBuffer_grow (StringBuffer_t *sb, unsigned long n)
{
sb->capacity += n;
sb->buffer = (char *) safe_realloc(sb->buffer, sb->capacity + 1);
}
Вполне вероятно, что
strncpy(sb->buffer + sb->length, s, len + 1);
в StringBuffer_append это источник моего segfault?
Если так, может кто-нибудь предложить исправление? Я действительно не знаю C ++, и меня особенно смущают указатели и адресация памяти, поэтому я, скорее всего, понятия не имею, о чем вы говорите - мне понадобится немного руки.
Кроме того, я выложил подробности моего процесса сборки онлайн здесь , на случай, если кто-то еще попытается скомпилировать C ++ для 64-битных систем с использованием Microsoft Visual C ++ Express Edition.
Заранее спасибо!
-Бен