今天使用clang++
和ifstream
时出现异常错误:
*** stack smashing detected ***: <unknown> terminated
我的代码看起来像这样:
uint32_t Lod::getGraphicsOffset(std::ifstream *file, int graphicsNumber) {
uint32_t filesAmount = 0;
fileStream.seekg(76 + graphicsNumber*32);
fileStream.read(reinterpret_cast<char*>(&filesAmount), 16);
return filesAmount;
}
但是当我在代码中仅更改fileAmount
位置时,它可以正常工作:
uint32_t Lod::getGraphicsOffset(std::ifstream *file, int graphicsNumber) {
fileStream.seekg(76 + graphicsNumber*32);
uint32_t filesAmount = 0;
fileStream.read(reinterpret_cast<char*>(&filesAmount), 16);
return filesAmount;
}
任何人都知道为什么?它的原因是什么?也许是一些UB?
答案 0 :(得分:5)
这是未定义的行为。
fileStream.read(reinterpret_cast<char*>(&filesAmount), 16);
告诉fileStream
将16个字节的数据放入filesAmount
。 filesAmount
然而uint32_t
意味着它只有4个字节大(假设一个8位字节)。因此,您开始在filesAmount
的末尾开始编写数据,而您不允许这样做。简单的解决方法是将其更改为
fileStream.read(reinterpret_cast<char*>(&filesAmount), sizeof(filesAmount));
答案 1 :(得分:4)
在:
fileStream.read(reinterpret_cast<char*>(&filesAmount), 16);
将16个字节读入4字节filesAmount
,这会破坏堆栈并导致未定义的行为。
修正:
fileStream.read(reinterpret_cast<char*>(&filesAmount), sizeof filesAmount);
你应该检查read
的返回值,以确保它成功:
if(!fileStream.read(reinterpret_cast<char*>(&filesAmount), sizeof filesAmount))
// Handle read failure.