`
pleasetojava
  • 浏览: 729472 次
  • 性别: Icon_minigender_2
  • 来自: 上海
文章分类
社区版块
存档分类
最新评论

__attribute__ noreturn

阅读更多

This attribute tells the compiler that the function won't ever return, and this can be used to suppress errors about code paths not being reached. The C library functions abort() and exit() are both declared with this attribute:

extern void exit(int)   __attribute__((noreturn));
extern void abort(void) __attribute__((noreturn));

Once tagged this way, the compiler can keep track of paths through the code and suppress errors that won't ever happen due to the flow of control never returning after the function call.

In this example, two nearly-identical C source files refer to an "exitnow()" function that never returns, but without the __attribute__ tag, the compiler issues a warning. The compiler is correct here, because it has no way of knowing that control doesn't return.

$ cat test1.c
extern void exitnow();

int foo(int n)
{
        if ( n > 0 )
	{
                exitnow();
		/* control never reaches this point */
	}
        else
                return 0;
}

$ cc -c -Wall test1.c
test1.c: In function `foo':
test1.c:9: warning: this function may return with or without a value

But when we add __attribute__, the compiler suppresses the spurious warning:

$ cat test2.c
extern void exitnow() __attribute__((noreturn));

int foo(int n)
{
        if ( n > 0 )
                exitnow();
        else
                return 0;
}

$ cc -c -Wall test2.c
no warnings!
分享到:
评论

相关推荐

    attribute详细介绍

    `__attribute__((noreturn))`属性用于标记那些不会返回到调用者的函数,如`exit`和`abort`。这可以帮助编译器进行优化,例如跳过一些不必要的清理工作。 **示例**: ```c extern void exit(int) __attribute__((no...

    GNU_CC中的attribute

    GNU CC 是一种基于 GCC(GNU ...此外,除了`format`属性,还有其他许多可用的函数属性,如`noreturn`(表示函数不会返回)、`malloc`(表示函数返回的内存需要手动释放)等,它们都能帮助编写更安全、更高效的C代码。

    __attribute__ - NSHipster.pdf

    例如,使用 __attribute__((availability(macosx,introduced=10.4,deprecated=10.6))) 指令可以指定函数的可用性信息,而使用 __attribute__((noreturn, format(printf, 1, 2))) 指令可以指定函数的返回性质和格式...

    获取封装类的私有属性

    raise AttributeError(f"'{self.__class__.__name__}' object has no attribute '{name}'") def __setattr__(self, name, value): if name == "__private_attribute": self._MyClass__private_attribute = ...

    mdk_armcc_user_guide.pdf

    例如,开发者可以使用__attribute__来指定某个函数不会返回(noreturn),以此告诉编译器,避免发出不必要的警告,从而使得代码更加清晰。 文档还提到了关于版本发布的信息,ARM Compiler v5.06 for µVision是在...

    解决运行出现'dict' object has no attribute 'has_key'问题

    return self.some_class.some_attribute ``` ##### 4. 使用继承 如果多个类都需要使用相同的属性或方法,可以考虑创建一个基类,并让其他类继承它。 ```python class BaseClass: def hover(self): print(...

    遍历并搜索枚举当前Windows Mobile系统中可用SD卡的源代码

    return ERROR_NO_DEVICE; } } else { memset(&stLFD,0,sizeof(stLFD)); if(!FindNextFile(hFile,&stLFD) || hFile == 0) { break; } } if(stLFD.dwFileAttributes != (FILE_...

    使用gcc和glibc来优化程序 转载.docx

    例如,`__attribute__((__noreturn__))`标记可以告诉编译器某个函数不会返回,这样编译器就能优化掉函数返回后的代码。另外,`__attribute__((__const__))`可以标记常量函数(pure function),表示函数对于相同的...

    Attributes VisualC++

    3. `__attribute__((noreturn))`: 标记一个函数不会返回,如`exit()`函数。 4. `__attribute__((nodiscard))`: 提示编译器发出警告,如果忽略返回值。 5. `__attribute__((deprecated))`: 标记过时的函数或类型,...

    Python私有变量的用法共1页.pdf.zip

    raise AttributeError(f"'{self.__class__.__name__}' object has no attribute '{name}'") def __setattr__(self, name, value): if name == 'private_var': self.__private_var = value else: super().__...

    GNU_C语言语法_扩展

    (Type Attributes)**:GNU C允许在声明中添加类型属性,如`__attribute__((aligned))`用于指定对齐要求,`__attribute__((malloc))`用于表示函数返回的新分配内存,还有`__attribute__((noreturn))`声明函数不会返回...

    thl_r16_tinav2.0_hm1375验证通过_增加打印设备ID_20170824_1447.7z

    ret = sysfs_create_group(&dev->pdev->dev.kobj, &vfe_attribute_group); #ifdef CONFIG_ES dev->early_suspend.level = EARLY_SUSPEND_LEVEL_DISABLE_FB + 1; dev->early_suspend.suspend = vfe_early_suspend...

    SSD7 选择题。Multiple-Choice

    (c) A component attribute can be a composite attribute. (d) A component attribute always contains other components. Correct answer is (c) 3. In the Entity-Relationship model, properties that ...

    hm1375_tinav2.1验证通过_增加设备ID的读取显示_20170825_1333没有外层目录.7z

    ret = sysfs_create_group(&dev->pdev->dev.kobj, &vfe_attribute_group); #ifdef CONFIG_ES dev->early_suspend.level = EARLY_SUSPEND_LEVEL_DISABLE_FB + 1; dev->early_suspend.suspend = vfe_early_suspend...

    由浅入深Linux下pthread线程库介绍

    extern void pthread_exit(void *__retval) __attribute__((__noreturn__)); ``` - 参数 `__retval` 是线程的退出状态,如果其他线程调用了 `pthread_join` 并且提供了非 `NULL` 的 `__thread_return`,那么这个...

    pugixml_x4相关库

    - **DOM模型**: 库中的`xml_node`和`xml_attribute`类代表XML节点和属性,提供了一系列API用于访问和修改XML结构。 - **序列化**: 可以将内存中的DOM树写回XML文件或字符串,保持原始格式或进行压缩。 - **内存...

    Android Native 内存泄漏系统化解决方案

    * static void __attribute__((no_instrument_function))init_once(void) { pthread_key_create(&sBackTraceKey, destructor);} * 初始化 thread_stack_t 放入 TLS 中:get_backtrace_info() { thread_stack_t* ptr ...

    浅谈keras通过model.fit_generator训练模型(节省内存)

    return img def generate_arrays_from_file(x_y): global count batch_size = 32 # 指定批量大小 while True: x_batch = [] y_batch = [] for i in range(batch_size): # 从x_y中随机选择一个样本 sample ...

    龚建伟_Visual_C++_Turbo_C串口通信编程实践

    dcbSerialParams.Parity = NOPARITY; // 无奇偶校验 SetCommState(hComm, &dcbSerialParams); // 清除缓冲区 PurgeComm(hComm, PURGE_RXCLEAR | PURGE_TXCLEAR); // 发送数据 const char* send_data = ...

Global site tag (gtag.js) - Google Analytics