编译警告的风险

时间:2014-10-29 07:42:54

标签: gcc armcc

我主要有两种编译警告:

1。隐含的功能声明

a.c中的

,它有char *foo(char *ptr1, char *ptr2),在b.c中,某些函数使用此foo函数而没有任何声明,我发现似乎编译器会处理函数{{ 1}}返回值作为整数,甚至我可以传递一些变量少于或多于foo函数声明

2。枚举类型与其他类型混合

我的目标芯片是ARM11,似乎即使我没有解决这两种编译警告,我的程序也可以毫无问题地运行,但我相信它必然会有一些风险。谁能给我一些很好的例子,这两种编译警告会引起一些意想不到的问题?

同时,如果这两个警告存在潜在风险,为什么c编译器会允许这些警告发生但不能直接将它们设置为错误?任何故事背后?

2 个答案:

答案 0 :(得分:2)

隐式声明。例如。你有功能:float foo(float a),在你打电话时没有声明。隐式规则将使用以下签名创建自动声明:int foo(double)(如果传递的参数为float)。因此,您传递的值将转换为double,但foo需要float。返回调用代码需要int,但返回float。价值观将是一团糟。

枚举与其他类型混合。枚举类型具有可以采用的值列表。如果您尝试为其分配数值,则有可能它不是列出的值之一;如果以后您的代码只需要指定的范围,并且假设其他任何东西都不存在 - 它可能会出错。

答案 1 :(得分:0)

简单示例:

档案:warn.c

#include <stdio.h>

double foo(double x)
{
  return myid(x);
}

int
main (void)
{
  double x = 1.0;
  fprintf (stderr, "%lg == %lg\n", x, foo (x));
  return 0;
}

档案:foo.c

double
myid (double x)
{
  return x;
}

编译并运行:

$ gcc warn.c foo.c -Wall
warn.c: In function ‘foo’:
warn.c:5: warning: implicit declaration of function ‘myfabs’
$ ./a.out 
1 == 0

旧C标准(C90)有这个奇怪的“默认int”规则,并且为了兼容性,即使在最新的编译器中也支持它。