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

Mic*_*ski -1 c++ clang++

今天,我得到不同寻常的错误时使用clang++ifstream:

*** stack smashing detected ***: <unknown> terminated
Run Code Online (Sandbox Code Playgroud)

我的代码看起来像这样:

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;
}
Run Code Online (Sandbox Code Playgroud)

但是,当我只改变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;
}
Run Code Online (Sandbox Code Playgroud)

谁知道为什么?它的原因是什么?也许是一些UB?

Nat*_*ica 5

这是未定义的行为.

fileStream.read(reinterpret_cast<char*>(&filesAmount), 16);
Run Code Online (Sandbox Code Playgroud)

告诉fileStream将16个字节的数据放入filesAmount. filesAmount但是它uint32_t意味着它只有4个字节大(假设一个8位字节).所以你开始写数据超过filesAmount你不允许做的结束.简单的解决方法是将其更改为

fileStream.read(reinterpret_cast<char*>(&filesAmount), sizeof(filesAmount));
Run Code Online (Sandbox Code Playgroud)