我有使用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优化字符串类的方式似乎是一个问题。
我们如何绕过这个想法?
答案 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优化级别中字符串优化的一些奇怪情况。