ubuntu下gcc的优化选项问题

其它类软件,非上述版软件
回复
leetking
帖子: 62
注册时间: 2014-10-28 14:53
系统: ubuntu-18.04-LTS

ubuntu下gcc的优化选项问题

#1

帖子 leetking » 2014-11-07 20:40

-----v-下面是hanoi.c的代码-----------

代码: 全选

#include <stdio.h>

void Hanoi(int n);
void _Hanoi(int n, char a, char c);

int main(int ac, char **av)
{
        int n;
        scanf("%d", &n);
        Hanoi(n);

        return 0;
}

void Hanoi(int n)
{
        _Hanoi(n, 'A', 'C');
}

void _Hanoi(int n, char a, char c)
{
        if(1 == n)
                printf("%c->%c\n", a, c);
        else
        {
                _Hanoi(n - 1, a, 'B');
                printf("%c->%c\n", a, 'C');
                _Hanoi(n - 1, 'B', c);
        }
}
下面是用gcc -O2 -o hanoi hanoi.c编译出现的警告,虽然是警告但很不爽,希望大家可以解决。

代码: 全选

liking@vm9:~$ gcc -O2 -o hanoi hanoi.c
hanoi.c: In function ‘main’:
hanoi.c:9:7: warning: ignoring return value of ‘scanf’, declared with attribute warn_unused_result [-Wunused-result]
  scanf("%d", &n);
       ^
=============================================================
按理说scanf的返回值多数情况下是忽略了的啊,怎么会这么苛刻地弹出警告呢?希望大家解释下。
头像
astolia
论坛版主
帖子: 6541
注册时间: 2008-09-18 13:11

Re: ubuntu下gcc的优化选项问题

#2

帖子 astolia » 2014-11-09 0:16

忽略scanf的返回值在实践中是个非常有问题的做法,gcc也是在尽职地提醒你做好基本的错误处理。scanf从用户输入读入数据,原则上不应当对读入的数据有任何假设。否则一旦有意或无意输入了预想外的数据,就会发生不可预知的后果。拿你这个例子来说如果用户输入的不是数字,而是一个字母,那么n的值就无法预测。

老老实实检查scanf的返回值对不对是最好的解决方案

至于为什么没加-O选项时不会提醒,是因为没加优化选项时,gcc的一部分代码流程分析没有做/不够深入,就找不出这个问题。
可以参考对uninitialized警告的说法: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=43361#c1
leetking
帖子: 62
注册时间: 2014-10-28 14:53
系统: ubuntu-18.04-LTS

Re: ubuntu下gcc的优化选项问题

#3

帖子 leetking » 2014-11-09 21:40

说的很对,我也听懂了。但是还是有个疑问,为什么以前我用老版本的gcc没有出现过这个情况,但是用这个gcc就出现了情况。这个怎么解释呢?
头像
astolia
论坛版主
帖子: 6541
注册时间: 2008-09-18 13:11

Re: ubuntu下gcc的优化选项问题

#4

帖子 astolia » 2014-11-10 19:25

你说的不清不楚,建议先看一遍“提问的智慧”一文,把必要的细节提供出来。
这是在stdio.h中做了需要使用返回值声明,gcc才会去检查,所以你首先需要去看你那个不知道多老的老版本gcc用的头文件中有没有加warn_unused_result属性。
然后gcc各版本之间的差异,你可以自行查看其发布说明 https://gcc.gnu.org/releases.html
leetking
帖子: 62
注册时间: 2014-10-28 14:53
系统: ubuntu-18.04-LTS

Re: ubuntu下gcc的优化选项问题

#5

帖子 leetking » 2014-11-10 22:31

好吧,谢谢了。看来我有必要学学提问的智慧啊 :em06
回复