前言
今天又被Pistche给坑了!
项目中同时使用了WAVM和Pistache两个开源代码,结果两者的头文件定义产生了冲突,导致了大量诡异的错误!
源代码
#include <pistache/common.h>
#include <WAVM/WASM/WASM.h>
int main() {
return 0;
}
Clion 构建报错信息
![](https://img.haomeiwen.com/i26486582/dcd293b2f48f45ba.png)
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
网友评论