【发布时间】:2020-08-25 06:41:09
【问题描述】:
考虑这段代码:
int __attribute__((warn_unused_result)) foo(void)
{
return 42;
}
int main(void)
{
foo();
}
编译时会发出警告:
$ gcc main.c
main.c: In function ‘main’:
main.c:8:5: warning: ignoring return value of ‘foo’, declared with attribute warn_unused_result [-Wunused-result]
8 | foo();
| ^~~~~
这符合预期。我想知道是否有任何理由为什么没有使用此属性声明许多标准库函数。我说的是像scanf 这样的函数,在大多数情况下检查返回值是至关重要的,还有像malloc 这样的函数,如果你不使用返回值,这完全没有意义。不过realloc好像有这个。
是否有任何理由不使用__attribute__((warn_unused_result)) 声明 scanf、malloc 等函数?我认为这可以防止许多错误。
【问题讨论】:
-
但scanf 具有该属性。 Some 还有其他功能。你必须定义_FORTIFY_SOURCE
-
也许有人认为 stdio.h 无论如何都是一个绝望的案例。大部分都是很危险的,应该是编程史上所有类别中最糟糕的编程库,它给人类造成了最多的错误和物质损失。与无法挽救的格式字符串、可变参数函数、可怕的 API、大约 35 种不同的显式未定义行为案例相比……好吧,忘记检查 scanf 的结果只是 stdio.h 错误海洋中的一滴。该库提供了许多其他方法来破坏缓冲区溢出和越界访问的代码。
-
@KamilCuk 这很奇怪。我没有收到任何警告。
-
@klutt Aaand 你必须启用优化godbolt link
-
@KamilCuk 用 O3 测试了 clang 和 gcc。没有警告。
标签: c gcc clang compiler-warnings