美文网首页
记一次Bug 调试 —— 第三方头文件冲突

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

作者: 蟹蟹宁 | 来源:发表于2021-08-09 00:22 被阅读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
    

    相关文章

      网友评论

          本文标题:记一次Bug 调试 —— 第三方头文件冲突

          本文链接:https://www.haomeiwen.com/subject/efmavltx.html