具有GCC优化的C ++代码会导致核心字符串上的free()无效

时间:2013-02-12 17:17:44

标签: c++ optimization gcc

我有使用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优化字符串类的方式似乎是一个问题。

我们如何绕过这个想法?

3 个答案:

答案 0 :(得分:2)

我无法解释为什么这个代码在使用优化进行编译时会崩溃,也许i得到的数字超过2位并且你有缓冲区溢出,也许它有所不同,但无论如何我会更改代码:< / p>

    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++);

或者让你的缓冲区更大。

答案 1 :(得分:2)

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

答案 2 :(得分:0)

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