带有GCC优化的C++代码会导致字符串上的core具有无效的free()
C++ code with GCC optimisation causes core with invalid free() on strings
我有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优化级别内的字符串优化出现了一些奇怪的情况。
相关文章:
- Openssl 1.1.1d无效使用不完整的类型"struct dsa_st"
- 无法访问嵌套类.类的使用无效
- 如果用户输入无效,如何使用字符串变量-C++重复输入命令
- 如何解决错误:SCIP C++中的 SCIP 阶段无效 <10>
- 在没有参数列表的情况下使用模板名称"Event"无效,模板问题
- FFMPEG配置文件级别id大小无效
- 错误:从"int"到枚举c++的转换无效
- 如何修复此错误:className::className的无效使用
- 为什么将值返回函数传递给重载=运算符对运算符函数有效,而对其他运算符无效
- C++-模板嵌套类的引用初始化无效
- 示例外壳应用程序显示的 V8 "segmentation fault (core dumped)"错误
- 错误:无效的预处理指令 #i 的意思是 #if?
- 多维数组 C++ 中数组下标的类型"int[int]"无效
- 在 C++ 中使用正则表达式错误时出现问题 括号表达式中的范围无效
- C++包含来自 #include "DevEngine/Core.h" 的错误
- 从 'int' 到 'int*' CPP 的转换无效
- 如何接受 [ENTER] 键作为无效输入并发送错误消息
- 由于无效的 ValidateRgn() 子窗口不会收到WM_PAINT消息
- 避免在使用WinAPI(Windows Core Audio)时无效的指针
- 带有GCC优化的C++代码会导致字符串上的core具有无效的free()