当函数返回错误类型的变量时没有编译错误

时间:2016-05-03 16:15:39

标签: c gcc lint

我有这个C计划。

#include <stdio.h>

unsigned char foo()
{
    int x = 1000;
    return x;
}

int main(int argc, char *argv[])
{
    printf("foo returns %d\n", foo());
}

我正在使用以下代码进行编译:

gcc -c -g -o ../tgt/Linux/main.c.o -Wall -fpic main.c
gcc ../tgt/Linux/main.c.o -g -o ../tgt/Linux/t -Wall

它会生成以下输出:

$ t
foo returns 232

这是xfoo()的低8位。所以,这是有道理的。但我的问题是:为什么这不会产生警告,是否有办法让我为这类错误产生警告?

1 个答案:

答案 0 :(得分:2)

在你提到的评论中:

  

我想知道为什么在使用-pedantic -Wall时都没有触发   -Wextra。

-Wall未启用-Wconversion标记[1]

-Wpedantic-pedantic都不会抓住

return x; // This is valid as per strict ISO C

实际上-pedantic只会检查任何GNU C扩展[2]

例如,如果你编译下面的东西:

int a=10;
int b[a]; // This is invalid as per strict ISO C

-pedantic,gcc会给你:

 warning: ISO C90 forbids variable length array ‘b’ [-Wvla]

因此唯一的选择是在编译时明确使用-Wconversion

gcc -Wconversion main.c -o main