使用ifstream时检测到堆栈粉碎的原因是什么?

时间:2018-05-10 16:36:51

标签: c++ clang++

今天使用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?

2 个答案:

答案 0 :(得分:5)

这是未定义的行为。

fileStream.read(reinterpret_cast<char*>(&filesAmount), 16);

告诉fileStream将16个字节的数据放入filesAmountfilesAmount然而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.