今天,我得到不同寻常的错误时使用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?
这是未定义的行为.
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)