在调试模式下但不在发布模式下获取警告(我是否会获得未定义的行为?)

时间:2015-06-17 12:02:37

标签: c

我有点奇怪的情况。我正在编译某些设备。 如果我在发布模式下编译 ,例如

makeCore projectname release exe

一切都很好。如果我在调试模式下编译

makeCore projectname debug exe

我收到以下警告:

src/administration.c: In function 'SetIp':
src/administration.c:1409: warning: implicit declaration of function 'InputIp'

问:这是否意味着在发布模式下使用我的应用程序是安全的?

为什么会出现这种情况?该怎么办?我正在使用在发布模式下编译的二进制文件,我应该担心吗?

编辑:我是否应该首先查看这个编译器符合哪个C标准,如果它是C89之前的那么我不应该担心,因为它不是未定义的行为吗?

Edit2:我的最终问题是,我是否正在处理未定义的行为,以及如何检查我是否正在处理未定义的行为?我不确定我的编译器是否实现了C89或C90等。也许我应该询问供应商是否存在未定义的行为我上面做了什么?

更新:

这是功能签名:

s32 InputIp(s32 line, u8 * text, s32 otherline, u8 *IP, u8 coordx, s32 coordy);

这就是它的名称:

s32 res = InputIp(someconstant, u8pointer, otherconstant, otheru8pointer, integer1, integer2);

最后一个问题:由于我首先收到此警告,我可以确定我使用的是使用C89的编译器吗?否则会出错?我是对的吗?

4 个答案:

答案 0 :(得分:1)

为什么你会有所不同,有几个可能的原因。

  1. 发布版本中降低编译器警告级别。
  2. 这是最可能的原因。

    1. 条件代码。
    2. 这样的事情可能是原因:

      `#ifndef DEBUG`
      
      `#include "ip.h"`
      
      `#endif`
      

      请注意,implicit declaration是一个警告,您应该认真对待,因为它可以隐藏错误。我建议您在需要时添加前向声明。

答案 1 :(得分:0)

您不应该依赖implicit declarations,但如果将InputIp定义为int InputIp();,您应该没问题。

答案 2 :(得分:0)

在C89中,如果函数是这样的原型(并且这个原型在函数体的位置可见,或者函数体使用相同的原型):

s32 InputIp(s32 line, u8 * text, s32 otherline, u8 *IP, u8 coordx, s32 coordy);

并且假设u8是一个8位类型,那么在没有范围原型的情况下调用此函数会导致未定义的行为。

这种情况下的规则(在没有范围原型的情况下调用prototyped函数)是所有参数和返回值必须在默认参数提升下保持不变。 Link to related thread

与可变函数中匹配...的参数相同的促销活动是:

  • 低于int的任何整数类型都会提升为int
  • float被提升为double
  • 所有其他类型保持不变

因此,默认参数促销会将u8更改为int

在C99中,调用范围内没有声明的函数是不正确的。

强烈建议修复代码,以便在范围内使用原型调用该函数。

答案 3 :(得分:-1)

尝试提供准时答案:

  1. left:警告意味着编译器无法找到Does this mean in the release mode it is safe to use my application函数原型。在两种二进制风格之间,预计应用程序的运行时行为(由此警告引起)不会有差异。您应该按照InputIp上的建议进行修复。

  2. 3:根据您传递给Why is this behaviour的参数

  3. ,似乎在Makefile中调整了编译器标志。
  4. make ...:为What to do?添加缺少的函数原型并重建您的应用程序。

  5. InputIp:在调试模式下编译的应用程序和在发布模式下编译的应用程序之间不应该由您的问题触发运行时差异。您应该遵循I am using the binary compiled in release mode, should I be worried?

  6. 中的建议
  7. 3:C89 / C90标准与您的问题无关。