相关疑难解决方法(0)

为什么"noreturn"函数会返回?

我读了关于属性的这个问题noreturn,它用于不返回调用者的函数.

然后我用C做了一个程序.

#include <stdio.h>
#include <stdnoreturn.h>

noreturn void func()
{
        printf("noreturn func\n");
}

int main()
{
        func();
}
Run Code Online (Sandbox Code Playgroud)

并使用以下代码生成代码的汇编:

.LC0:
        .string "func"
func:
        pushq   %rbp
        movq    %rsp, %rbp
        movl    $.LC0, %edi
        call    puts
        nop
        popq    %rbp
        ret   // ==> Here function return value.
main:
        pushq   %rbp
        movq    %rsp, %rbp
        movl    $0, %eax
        call    func
Run Code Online (Sandbox Code Playgroud)

为什么函数func()在提供noreturn属性后返回?

c assembly function-call c11 noreturn

71
推荐指数
8
解决办法
1万
查看次数

海湾合作委员会第7号, - 明显的通过警告,以及清除它们的便携方式?

我们正在接受GCC 7的警告,因为它在switch语句中是隐含的.以前,我们在Clang下清除它们(这是下面评论的原因):

g++ -DNDEBUG -g2 -O3 -std=c++17 -Wall -Wextra -fPIC -c authenc.cpp
asn.cpp: In member function ‘void EncodedObjectFilter::Put(const byte*, size_t)’:
asn.cpp:359:18: warning: this statement may fall through [-Wimplicit-fallthrough=]
    m_state = BODY;  // fall through
                  ^
asn.cpp:361:3: note: here
   case BODY:
   ^~~~
Run Code Online (Sandbox Code Playgroud)

GCC手册状态使用__attribute__ ((fallthrough)),但它不便于携带.该手册还指出"...也可以添加一个通过注释来消除警告",但它只提供FALLTHRU(这真的是唯一的选择吗?):

switch (cond)
  {
  case 1:
    bar (0);
    /* FALLTHRU */
  default:
    …
  }
Run Code Online (Sandbox Code Playgroud)

对于Clang和GCC,是否有通过警告来清除坠落的便携方法?如果是的话那么它是什么?

c++ gcc warnings switch-statement

31
推荐指数
2
解决办法
1万
查看次数

在C11中使用_Noreturn

可能重复:
Noreturn属性的重点是什么?

C11引入了_Noreturn属性来指示函数永远不会返回.

除了源代码中的文档值之外,该属性还提供了哪些其他好处,以及为什么要使用它?

c c11

17
推荐指数
2
解决办法
6435
查看次数

是否必须对退出函数进行noreturn属性?

noreturn永不归还函数的属性是否必要,或者这只是一个(可能是不成熟的? - 至少对于退出,我无法想象为什么要优化)优化?

向我解释说,在诸如此类的背景下

void myexit(int s) _Noreturn {
   exit(s);
}
// ...
if (!p) { myexit(1); } 
f(*p);
/// ...
Run Code Online (Sandbox Code Playgroud)

noreturn防止!p分支被优化.但是编译器是否真的允许优化该分支?我意识到优化它的基本原理是:"未定义的行为不会发生.如果p== NULL,则解除引用它是UB,因此p永远不会NULL在此上下文中,因此!p分支不会触发".但是编译器不能通过假设myexit可能是一个不返回的函数来解决问题(即使它没有明确标记为这样)?

c language-lawyer c11

12
推荐指数
1
解决办法
168
查看次数

[[noreturn]]函数如何具有返回类型?

我遇到了"高度可读"和"优雅"代码的"漂亮"示例,但我遇到了麻烦:

struct S {

    [[noreturn]] virtual inline auto f(const unsigned long int *const)
                         –> void const noexcept;
};
Run Code Online (Sandbox Code Playgroud)

这是我的理解(如果我错了,请纠正我):

  • f() 是...的成员函数 S
  • virtual - 可以被派生类覆盖
  • inline- 编译器应该尝试为调用生成代码f而不是正常调用它
  • const- 该功能无法更改任何S成员
  • noexcept - 该函数永远不会抛出(不能扔或不允许抛出)
  • parameter:const指向a的指针const unsigned long int
  • auto .... -> void - 后缀返回类型 void
  • [[noreturn]]-它从来没有returnŠ

以下是我的主要关注点:

  • 如果一个函数被声明为[[noreturn]],它永远不会返回给它的调用者; 那它怎么会有一个返回类型void?无论如何,这个函数的返回类型有什么意义?
  • 这段代码是否会编译int而不是void例如?
  • 这样的功能有什么用处?要抛出异常?
  • 在此函数完成执行(之后})后,代码的流程在哪里?

我无法在VS2013预览版上运行此代码,所以我猜这些功能尚未实现.

我对此非常好奇,所以如果有人能解释我会很感激!干杯

c++ return function noreturn

9
推荐指数
2
解决办法
2736
查看次数

为什么/什么时候你应该使用 __attribute__((noreturn))?

据我了解,该属性告诉编译器函数不会返回。当函数返回 void 时指定 this 有什么好处?

这两个功能有何不同?

void foo(){}
__attribute__((noreturn)) void foo(){}
Run Code Online (Sandbox Code Playgroud)

c c++ attributes

6
推荐指数
2
解决办法
1490
查看次数

C++:[[maybe_noreturn]]

据我所知,[[maybe_noreturn]]C++ 中没有属性。

我有一个如下所示的函数:

void func() {
    try {
        do_something();
    } catch (const std::exception& e) {
        std::exit(1);
    }
}
Run Code Online (Sandbox Code Playgroud)

如果我标记func[[noreturn]]我会遇到 UB 的快乐案例。当我没有从未标记为 的函数返回时,这是 UB 吗[[noreturn]]

或者是否有其他语言结构、编译器扩展或库可以实现类似的功能[[maybe_noreturn]]

c++

5
推荐指数
1
解决办法
239
查看次数