小编陈泽霖*_*陈泽霖的帖子

当函数有警告 [-Wreturn-type] 时,为什么优化会忽略 if 语句?

操作系统:ubuntu2204

编译器:gcc 11.2 x86_64

这是一个简单的代码:


#include <cstdlib>

int func(int val) {
    if (val == 1) {
    } else {
        abort();
    }
}

int main(int argc, char* argv[]) {
    func(argc);
}

Run Code Online (Sandbox Code Playgroud)

当我在没有任何优化的情况下编译它并运行它时,它工作正常。

但是当我用 编译它时g++ tmp.cpp -O3,结果func会忽略输入值,而只调用abort.

当然,我可以通过在 的末尾添加 return 语句来修复它func,但是,为什么呢?

这是objdump -d a.out优化函数的一些输出func


0000000000001060 <_Z4funci>:
    1060:   f3 0f 1e fa             endbr64 
    1064:   50                      push   %rax
    1065:   58                      pop    %rax
    1066:   50                      push   %rax
    1067:   e8 e4 ff ff ff …
Run Code Online (Sandbox Code Playgroud)

c++ optimization assembly compiler-optimization undefined-behavior

4
推荐指数
2
解决办法
228
查看次数

如何在不导致段错误的情况下测试“dynamic_cast”的结果

我正在使用多态和模板编写一个类,就像:


class base {
    virtual ~base() = default;
};

template <typename T>
class derived : public base {
T a;
    void save(T a_) { a = a_; }
};
Run Code Online (Sandbox Code Playgroud)

所以当我想使用 function 时derived::save(),基本上,我需要dynamic_cast,但它无法检查它是好演员还是坏演员:

void test() {
    base *p = new derived<float>();
    // good case
    dynamic_cast<derived<float>*>(p)->save(1);
    // bad case
    dynamic_cast<derived<int>*>(p)->save(1);
}

Run Code Online (Sandbox Code Playgroud)

如您所见,好的情况下工作正常,但坏的情况会导致段错误,这在大型项目中很难定位。

那么,有什么方法可以检查cast, 并警告用户:

template <typename T>
class derived : public base {
T a;
using type = T;
/// of course this would not work, …
Run Code Online (Sandbox Code Playgroud)

c++ polymorphism templates

3
推荐指数
1
解决办法
67
查看次数