gpt4 book ai didi

crash - C++:使用gcc 9.1、9.2进行任何级别的优化时崩溃

转载 作者:行者123 更新时间:2023-12-02 07:10:29 28 4
gpt4 key购买 nike

如果使用gcc.9.1和9.2编译,以下代码将崩溃。如果使用较旧的gcc编译,则一切正常。

#include <cstdlib>

struct A
{
A()
{
set( nullptr );
}

std::ptrdiff_t offset_;

void set( void* ptr )
{
offset_ = reinterpret_cast<char*>( ptr ) - reinterpret_cast<char*>( this );
}

void* get()
{
return reinterpret_cast<char*>( this ) + offset_;
}
};

int main()
{
A a;

int *b = static_cast<int*>( a.get() );

if( !b )
a.set( b = new int{ 10 } );

return *b;
}

链接到coliru上的代码: http://coliru.stacked-crooked.com/a/3f5b4623a98fd0b5

看看汇编程序,我发现gcc消除了 if语句。链接到Godbolt: https://godbolt.org/z/HrX3Uc

所以问题是:
是gcc中需要报告的错误,还是我的程序包含一些UB?

最佳答案

struct A
{
A()
{
set( this );
}

std::ptrdiff_t offset_;

void set( void* ptr )
{
offset_ = reinterpret_cast<char*>( this ) - reinterpret_cast<char*>( ptr );
}
bool hasValue()
{
return offset_ != 0;
}
void* get()
{
return reinterpret_cast<char*>( this ) - offset_;
}
};

int main()
{
A a;

int *b = static_cast<int*>( a.get() );

// nullptr != 0
if(!a.hasValue())
a.set( b = new int{ 10 } );

return *b;
}

关于crash - C++:使用gcc 9.1、9.2进行任何级别的优化时崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60193961/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com