gpt4 book ai didi

c++ - Win XP x64 上的段错误在 XP x32 上不会发生 - strncpy 问题?怎么修?

转载 作者:行者123 更新时间:2023-11-28 04:00:58 25 4
gpt4 key购买 nike

我对使用 C++ 非常缺乏经验,但我正在尝试编译 SBML toolbox 的 2.0.2 版适用于 64 位 XP 平台上的 matlab。 SBML 工具箱依赖于 Xerces 2.8 和 libsbml 2.3.5.

我已经能够在 32 位机器上构建和编译工具箱,并且在我测试时它可以正常工作。但是,在 64 位机器(这是一个巨大的 PITA!)上重建它之后,当我尝试用它读取长 .xml 文件时出现段错误。

我怀疑问题是由 pointer addresses issues 引起的.

来自段错误的 Stack Trace 开始于:

[ 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 (

So I'm looking at the StringBuffer_append function in the libsbml code:

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;
}

ensureCapacity 看起来像这样:

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 是我的段错误的来源吗?

如果是这样,有人可以提出修复建议吗?我真的不懂 C++,并且对指针和内存寻址特别困惑,所以可能不知道你在说什么 - 我需要一些帮助。

此外,我将构建过程的详细信息放在网上 here ,以防其他人尝试使用 Microsoft Visual C++ Express Edition 为 64 位系统编译 C++。

提前致谢!

-本

最佳答案

尝试打印或使用调试器来查看您为某些中间变量获得的值。在 StringBuffer_append() O/P len 中,在 StringBuffer_ensureCapacity() 中观察循环之前和循环中的 sb->capacity 和 c。查看这些值是否有意义。

访问超出字符串末尾的数据可能会导致段错误。

它在 32 位机器上运行而不是 64 位操作系统上运行的奇怪事实也是一个线索。两台机器的物理和页面文件内存大小是否相同?此外,在 64 位机器中,内核空间可能比 32 位机器大,并且占用了 32 位 O/S 内存空间用户部分中的一些可用内存空间。对于 XML,整个文档必须适合内存。如果这是问题所在,可能有一些开关可以设置大小。只有当您使用非常大的字符串时,机器的差异才是导致问题的原因。如果字符串不是很大,则可能是库或实用程序方法在 64 位环境中无法正常工作的问题。

此外,如果您别无选择,请使用一个简单/小的 xml 文件开始。

你在哪里初始化sb->length。您的问题可能出在 strncpy() 中,但我不知道为什么 32 位 -> 64 位 O/S 更改会很重要。最好的办法是查看中间值,这样您的问题就会很明显。

关于c++ - Win XP x64 上的段错误在 XP x32 上不会发生 - strncpy 问题?怎么修?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/586597/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com