记一次Bug 调试 —— 第三方头文件冲突

2021-08-09  本文已影响0人  蟹蟹宁

前言

今天又被Pistche给坑了!
项目中同时使用了WAVMPistache两个开源代码,结果两者的头文件定义产生了冲突,导致了大量诡异的错误!

源代码

#include <pistache/common.h>
#include <WAVM/WASM/WASM.h>

int main() {
    return 0;
}

Clion 构建报错信息

可以发现WAVM和pistache都定义了宏函数unreachable,先引入的头文件,覆盖了后引入的头文件,因此WAVM的定义被pistache覆盖了

修复

一、调整头文件顺序
#include <WAVM/WASM/WASM.h>
#include <pistache/common.h>

这种做法治标不治本,因为pistache中比较简单,因此在这里被覆盖不会报错。

但是显然这个方案是不合适的。

二、修改其中之一,化解冲突

我在Pistache的源码上进行了修改,将
#define unreachable() __builtin_unreachable()
替换为
#define UNREACHABLE() __builtin_unreachable()

后记

回过头来看,这个Bug并不像我之前遇到的多线程和内存泄漏Bug那么难定位,只要仔细的看看上图中编译器给出的信息就行了,毕竟是编译错误。

但是当时我看到不下大几十行的报错信息,瞬间就不想看了。。。

于是就根据我的经验,经了漫长的Debug,大概有3、4个小时,最后还是看了报错信息才最终找到了问题所在!

我的第一反应,是不是我构建WAVM的Cmake配置文件不太对,怎么怎么样的,,,反正挺蠢的,毕竟第一次遇到这种问题,以后还是要多看编译器的提示!!!

完整的构建报错信息如下:

====================[ Build | TEST-header_file_conflict | Debug ]===============
/usr/local/bin/cmake --build /home/kingdo/CLionProjects/RFIT/cmake-build-debug --target TEST-header_file_conflict -- -j 9
[  0%] Building CXX object test/CMakeFiles/TEST-header_file_conflict.dir/header_file_conflict.cpp.o
In file included from /home/kingdo/CLionProjects/RFIT/cmake-build-debug/_deps/wavm_ext-src/Include/WAVM/IR/Types.h:10,
                 from /home/kingdo/CLionProjects/RFIT/cmake-build-debug/_deps/wavm_ext-src/Include/WAVM/IR/Operators.h:6,
                 from /home/kingdo/CLionProjects/RFIT/cmake-build-debug/_deps/wavm_ext-src/Include/WAVM/IR/Validate.h:6,
                 from /home/kingdo/CLionProjects/RFIT/cmake-build-debug/_deps/wavm_ext-src/Include/WAVM/WASM/WASM.h:4,
                 from /home/kingdo/CLionProjects/RFIT/test/header_file_conflict.cpp:8:
/home/kingdo/CLionProjects/RFIT/cmake-build-debug/_deps/wavm_ext-src/Include/WAVM/Inline/Assert.h:15:27: error: macro "unreachable" passed 1 arguments, but takes just 0
   15 |     #condition, __FILE__, __LINE__};                                                   \
      |                           ^~~~~~~~
/home/kingdo/CLionProjects/RFIT/cmake-build-debug/_deps/wavm_ext-src/Include/WAVM/IR/Operators.h:219:3: note: in expansion of macro ‘WAVM_ASSERT’
  219 |   WAVM_ASSERT(nextByte + sizeof(OpcodeAndImm<Imm>) <= end);                                  \
      |   ^~~~~~~~~~~
/home/kingdo/CLionProjects/RFIT/cmake-build-debug/_deps/wavm_ext-src/Include/WAVM/IR/OperatorTable.h:20:2: note: in expansion of macro ‘VISIT_OPCODE’
   20 |  visitOp(0x0000, unreachable        , "unreachable"                      , NoImm                     , POLYMORPHIC               , mvp                    )   \
      |  ^~~~~~~
/home/kingdo/CLionProjects/RFIT/cmake-build-debug/_deps/wavm_ext-src/Include/WAVM/IR/OperatorTable.h:618:2: note: in expansion of macro ‘WAVM_ENUM_PARAMETRIC_OPERATORS’
  618 |  WAVM_ENUM_PARAMETRIC_OPERATORS(visitOp)                                                        \
      |  ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/home/kingdo/CLionProjects/RFIT/cmake-build-debug/_deps/wavm_ext-src/Include/WAVM/IR/Operators.h:225:5: note: in expansion of macro ‘WAVM_ENUM_OPERATORS’
  225 |     WAVM_ENUM_OPERATORS(VISIT_OPCODE)
      |     ^~~~~~~~~~~~~~~~~~~
/home/kingdo/CLionProjects/RFIT/test/header_file_conflict.cpp:5: note: macro "unreachable" defined here
    5 | #define unreachable() __builtin_unreachable()
      | 
In file included from /home/kingdo/CLionProjects/RFIT/cmake-build-debug/_deps/wavm_ext-src/Include/WAVM/IR/Validate.h:6,
                 from /home/kingdo/CLionProjects/RFIT/cmake-build-debug/_deps/wavm_ext-src/Include/WAVM/WASM/WASM.h:4,
                 from /home/kingdo/CLionProjects/RFIT/test/header_file_conflict.cpp:8:
/home/kingdo/CLionProjects/RFIT/cmake-build-debug/_deps/wavm_ext-src/Include/WAVM/IR/Operators.h:261:35: error: macro "unreachable" passed 1 arguments, but takes just 0
  261 |   WAVM_ENUM_OPERATORS(VISIT_OPCODE)
      |                                   ^
/home/kingdo/CLionProjects/RFIT/test/header_file_conflict.cpp:5: note: macro "unreachable" defined here
    5 | #define unreachable() __builtin_unreachable()
      | 
In file included from /home/kingdo/CLionProjects/RFIT/cmake-build-debug/_deps/wavm_ext-src/Include/WAVM/WASM/WASM.h:4,
                 from /home/kingdo/CLionProjects/RFIT/test/header_file_conflict.cpp:8:
/home/kingdo/CLionProjects/RFIT/cmake-build-debug/_deps/wavm_ext-src/Include/WAVM/IR/Validate.h:32:35: error: macro "unreachable" passed 1 arguments, but takes just 0
   32 |   WAVM_ENUM_OPERATORS(VISIT_OPCODE)
      |                                   ^
/home/kingdo/CLionProjects/RFIT/test/header_file_conflict.cpp:5: note: macro "unreachable" defined here
    5 | #define unreachable() __builtin_unreachable()
      | 
In file included from /home/kingdo/CLionProjects/RFIT/cmake-build-debug/_deps/wavm_ext-src/Include/WAVM/WASM/WASM.h:4,
                 from /home/kingdo/CLionProjects/RFIT/test/header_file_conflict.cpp:8:
/home/kingdo/CLionProjects/RFIT/cmake-build-debug/_deps/wavm_ext-src/Include/WAVM/IR/Validate.h:56:35: error: macro "unreachable" passed 1 arguments, but takes just 0
   56 |   WAVM_ENUM_OPERATORS(VISIT_OPCODE)
      |                                   ^
/home/kingdo/CLionProjects/RFIT/test/header_file_conflict.cpp:5: note: macro "unreachable" defined here
    5 | #define unreachable() __builtin_unreachable()
      | 
In file included from /home/kingdo/CLionProjects/RFIT/cmake-build-debug/_deps/wavm_ext-src/Include/WAVM/WASM/WASM.h:4,
                 from /home/kingdo/CLionProjects/RFIT/test/header_file_conflict.cpp:8:
/home/kingdo/CLionProjects/RFIT/cmake-build-debug/_deps/wavm_ext-src/Include/WAVM/IR/Validate.h:56:35: error: macro "unreachable" passed 1 arguments, but takes just 0
   56 |   WAVM_ENUM_OPERATORS(VISIT_OPCODE)
      |                                   ^
/home/kingdo/CLionProjects/RFIT/test/header_file_conflict.cpp:5: note: macro "unreachable" defined here
    5 | #define unreachable() __builtin_unreachable()
      | 
In file included from /home/kingdo/CLionProjects/RFIT/cmake-build-debug/_deps/wavm_ext-src/Include/WAVM/WASM/WASM.h:4,
                 from /home/kingdo/CLionProjects/RFIT/test/header_file_conflict.cpp:8:
/home/kingdo/CLionProjects/RFIT/cmake-build-debug/_deps/wavm_ext-src/Include/WAVM/IR/Validate.h:56:35: error: macro "unreachable" passed 1 arguments, but takes just 0
   56 |   WAVM_ENUM_OPERATORS(VISIT_OPCODE)
      |                                   ^
/home/kingdo/CLionProjects/RFIT/test/header_file_conflict.cpp:5: note: macro "unreachable" defined here
    5 | #define unreachable() __builtin_unreachable()
      | 
In file included from /home/kingdo/CLionProjects/RFIT/cmake-build-debug/_deps/wavm_ext-src/Include/WAVM/IR/Validate.h:6,
                 from /home/kingdo/CLionProjects/RFIT/cmake-build-debug/_deps/wavm_ext-src/Include/WAVM/WASM/WASM.h:4,
                 from /home/kingdo/CLionProjects/RFIT/test/header_file_conflict.cpp:8:
/home/kingdo/CLionProjects/RFIT/cmake-build-debug/_deps/wavm_ext-src/Include/WAVM/IR/Operators.h:260:2: error: variable or field ‘unreachable’ declared void
  260 |  }
      |  ^
/home/kingdo/CLionProjects/RFIT/cmake-build-debug/_deps/wavm_ext-src/Include/WAVM/IR/OperatorTable.h:20:2: note: in expansion of macro ‘VISIT_OPCODE’
   20 |  visitOp(0x0000, unreachable        , "unreachable"                      , NoImm                     , POLYMORPHIC               , mvp                    )   \
      |  ^~~~~~~
/home/kingdo/CLionProjects/RFIT/cmake-build-debug/_deps/wavm_ext-src/Include/WAVM/IR/OperatorTable.h:618:2: note: in expansion of macro ‘WAVM_ENUM_PARAMETRIC_OPERATORS’
  618 |  WAVM_ENUM_PARAMETRIC_OPERATORS(visitOp)                                                        \
      |  ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/home/kingdo/CLionProjects/RFIT/cmake-build-debug/_deps/wavm_ext-src/Include/WAVM/IR/Operators.h:261:3: note: in expansion of macro ‘WAVM_ENUM_OPERATORS’
  261 |   WAVM_ENUM_OPERATORS(VISIT_OPCODE)
      |   ^~~~~~~~~~~~~~~~~~~
/home/kingdo/CLionProjects/RFIT/cmake-build-debug/_deps/wavm_ext-src/Include/WAVM/IR/Operators.h:260:2: error: expected ‘;’ at end of member declaration
  260 |  }
      |  ^
/home/kingdo/CLionProjects/RFIT/cmake-build-debug/_deps/wavm_ext-src/Include/WAVM/IR/OperatorTable.h:20:2: note: in expansion of macro ‘VISIT_OPCODE’
   20 |  visitOp(0x0000, unreachable        , "unreachable"                      , NoImm                     , POLYMORPHIC               , mvp                    )   \
      |  ^~~~~~~
/home/kingdo/CLionProjects/RFIT/cmake-build-debug/_deps/wavm_ext-src/Include/WAVM/IR/OperatorTable.h:618:2: note: in expansion of macro ‘WAVM_ENUM_PARAMETRIC_OPERATORS’
  618 |  WAVM_ENUM_PARAMETRIC_OPERATORS(visitOp)                                                        \
      |  ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/home/kingdo/CLionProjects/RFIT/cmake-build-debug/_deps/wavm_ext-src/Include/WAVM/IR/Operators.h:261:3: note: in expansion of macro ‘WAVM_ENUM_OPERATORS’
  261 |   WAVM_ENUM_OPERATORS(VISIT_OPCODE)
      |   ^~~~~~~~~~~~~~~~~~~
In file included from /home/kingdo/CLionProjects/RFIT/cmake-build-debug/_deps/wavm_ext-src/Include/WAVM/WASM/WASM.h:4,
                 from /home/kingdo/CLionProjects/RFIT/test/header_file_conflict.cpp:8:
/home/kingdo/CLionProjects/RFIT/cmake-build-debug/_deps/wavm_ext-src/Include/WAVM/IR/OperatorTable.h:20:18: error: variable or field ‘unreachable’ declared void
   20 |  visitOp(0x0000, unreachable        , "unreachable"                      , NoImm                     , POLYMORPHIC               , mvp                    )   \
      |                  ^~~~~~~~~~~
/home/kingdo/CLionProjects/RFIT/cmake-build-debug/_deps/wavm_ext-src/Include/WAVM/IR/Validate.h:31:67: note: in definition of macro ‘VISIT_OPCODE’
   31 | #define VISIT_OPCODE(_, name, nameString, Imm, ...) WAVM_API void name(Imm imm = {});
      |                                                                   ^~~~
/home/kingdo/CLionProjects/RFIT/cmake-build-debug/_deps/wavm_ext-src/Include/WAVM/IR/OperatorTable.h:618:2: note: in expansion of macro ‘WAVM_ENUM_PARAMETRIC_OPERATORS’
  618 |  WAVM_ENUM_PARAMETRIC_OPERATORS(visitOp)                                                        \
      |  ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/home/kingdo/CLionProjects/RFIT/cmake-build-debug/_deps/wavm_ext-src/Include/WAVM/IR/Validate.h:32:3: note: in expansion of macro ‘WAVM_ENUM_OPERATORS’
   32 |   WAVM_ENUM_OPERATORS(VISIT_OPCODE)
      |   ^~~~~~~~~~~~~~~~~~~
/home/kingdo/CLionProjects/RFIT/cmake-build-debug/_deps/wavm_ext-src/Include/WAVM/IR/Validate.h:55:2: error: variable or field ‘unreachable’ declared void
   55 |  }
      |  ^
/home/kingdo/CLionProjects/RFIT/cmake-build-debug/_deps/wavm_ext-src/Include/WAVM/IR/OperatorTable.h:20:2: note: in expansion of macro ‘VISIT_OPCODE’
   20 |  visitOp(0x0000, unreachable        , "unreachable"                      , NoImm                     , POLYMORPHIC               , mvp                    )   \
      |  ^~~~~~~
/home/kingdo/CLionProjects/RFIT/cmake-build-debug/_deps/wavm_ext-src/Include/WAVM/IR/OperatorTable.h:618:2: note: in expansion of macro ‘WAVM_ENUM_PARAMETRIC_OPERATORS’
  618 |  WAVM_ENUM_PARAMETRIC_OPERATORS(visitOp)                                                        \
      |  ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/home/kingdo/CLionProjects/RFIT/cmake-build-debug/_deps/wavm_ext-src/Include/WAVM/IR/Validate.h:56:3: note: in expansion of macro ‘WAVM_ENUM_OPERATORS’
   56 |   WAVM_ENUM_OPERATORS(VISIT_OPCODE)
      |   ^~~~~~~~~~~~~~~~~~~
/home/kingdo/CLionProjects/RFIT/cmake-build-debug/_deps/wavm_ext-src/Include/WAVM/IR/Validate.h:55:2: error: expected ‘;’ at end of member declaration
   55 |  }
      |  ^
/home/kingdo/CLionProjects/RFIT/cmake-build-debug/_deps/wavm_ext-src/Include/WAVM/IR/OperatorTable.h:20:2: note: in expansion of macro ‘VISIT_OPCODE’
   20 |  visitOp(0x0000, unreachable        , "unreachable"                      , NoImm                     , POLYMORPHIC               , mvp                    )   \
      |  ^~~~~~~
/home/kingdo/CLionProjects/RFIT/cmake-build-debug/_deps/wavm_ext-src/Include/WAVM/IR/OperatorTable.h:618:2: note: in expansion of macro ‘WAVM_ENUM_PARAMETRIC_OPERATORS’
  618 |  WAVM_ENUM_PARAMETRIC_OPERATORS(visitOp)                                                        \
      |  ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/home/kingdo/CLionProjects/RFIT/cmake-build-debug/_deps/wavm_ext-src/Include/WAVM/IR/Validate.h:56:3: note: in expansion of macro ‘WAVM_ENUM_OPERATORS’
   56 |   WAVM_ENUM_OPERATORS(VISIT_OPCODE)
      |   ^~~~~~~~~~~~~~~~~~~
make[3]: *** [test/CMakeFiles/TEST-header_file_conflict.dir/build.make:82: test/CMakeFiles/TEST-header_file_conflict.dir/header_file_conflict.cpp.o] Error 1
make[2]: *** [CMakeFiles/Makefile2:3814: test/CMakeFiles/TEST-header_file_conflict.dir/all] Error 2
make[1]: *** [CMakeFiles/Makefile2:3821: test/CMakeFiles/TEST-header_file_conflict.dir/rule] Error 2
make: *** [Makefile:1401: TEST-header_file_conflict] Error 2
上一篇下一篇

猜你喜欢

热点阅读