-1

我有使用 gcc (4.1.2) 和 -O2 构建的 C++ 代码。

当此代码在没有优化的情况下编译和运行时,程序执行没有任何问题。

当使用 O1/O2/O3 编译时,代码将崩溃,并显示一个 valgrind 指示无效的空闲。这已缩小到函数内的字符串变量。

代码将读入一个文件,并迭代内容。我已经删除了所有处理代码,下面的代码片段导致核心...

int MyParser::iParseConfig(Config &inConfig)
{
    bool keepGoing = true;

    while(keepGoing)
    {
        string valueKey = "";
        keepGoing = false;
    }
    return 0;
}

当它在未优化的情况下运行时,它工作正常。当我构建并运行此优化后,它将无法正常工作。

这似乎是 GCC 优化字符串类的方式的问题。

任何想法我们可以如何规避这个?

4

3 回答 3

2

我无法解释为什么这段代码在使用优化编译时i会为您崩溃,可能超过 2 位并且您有缓冲区溢出,也许它有所不同,但无论如何我会更改代码:

    sprintf(charIndex, "%d", i++);
    string valueKey = "";
    valueKey.append("Value").append(charIndex);
    string value = inConfig.sFindField(valueKey);

像这样:

    stringstream ss;
    ss << "Value" << i++;
    string value(ss.str());

它更像 C++,应该可以工作。试试看。

如果您想知道这是否真的是缓冲区溢出情况,请插入以下行:

    assert(i < 99);

在调用之前printf。或使用snprintf

    snprintf(charIndex, sizeof(charIndex), "%d", i++);

或者让你的缓冲区更大。

于 2013-02-12T17:24:36.490 回答
2

如果您溢出 charIndex,(当 i 高于 99 时)谁知道您的程序状态是什么……您声明的存储空间不是很大(2 个字符和一个空值)。

于 2013-02-12T17:24:50.657 回答
0

这是错误包含头文件的问题 - 在包含列表中存在重复包含的 MyParser.h 文件。这导致了 GCC 优化级别中的字符串优化出现了一些奇怪的情况。

于 2013-02-13T12:26:21.507 回答