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

C++ code with GCC optimisation causes core with invalid free() on strings

本文关键字:core 无效 free C++ 优化 GCC 代码 带有 字符串      更新时间:2023-10-16

我有C++代码,它是用带有-O2的gcc(4.1.2)构建的。

当编译和运行此代码时,没有任何优化,程序执行时不会出现任何问题。

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

代码将在文件中读取,并对内容进行迭代。我已经删除了所有处理代码,下面的代码片段导致核心。。。

int MyParser::iParseConfig(Config &inConfig)
{
    bool keepGoing = true;
    while(keepGoing)
    {
        string valueKey = "";
        keepGoing = false;
    }
    return 0;
}

当在未优化的情况下运行时,效果良好。当我构建并运行此优化时,它将不起作用。

GCC优化字符串类的方式似乎存在问题。

有什么想法可以绕过这一点吗?

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

我无法解释为什么在使用优化编译时,此代码会崩溃,可能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);

在呼叫CCD_ 2之前。或者使用snprintf:

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

或者加大缓冲区。

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