库函数默认具有弱属性(参见[1]),可以被同签名的函数“覆盖”。例如,printf
在内部调用 fputc
,我很容易声明一个同签名的函数 int fputc(int, FILE *)
。如果这种情况发生,我希望收到编译器警告。
有没有办法告诉编译器在覆盖弱函数时发出警告?
[1] https://gcc.gnu.org/onlinedocs/gcc-3.2/gcc/Function-Attributes.html
库函数默认具有弱属性(参见[1]),可以被同签名的函数“覆盖”。例如,printf
在内部调用 fputc
,我很容易声明一个同签名的函数 int fputc(int, FILE *)
。如果这种情况发生,我希望收到编译器警告。
有没有办法告诉编译器在覆盖弱函数时发出警告?
[1] https://gcc.gnu.org/onlinedocs/gcc-3.2/gcc/Function-Attributes.html
我猜你正在使用Linux,并像往常一样编译和链接你的应用程序,特别是使用libc.so
进行动态链接)。
库函数默认设置了弱属性(weak attribute)
这并不总是正确的;在我的系统上,fputc
不是一个弱符号:
% nm -D /lib/x86_64-linux-gnu/libc-2.21.so|grep fputc
000000000006fdf0 T fputc
0000000000071ea0 T fputc_unlocked
T
将会是 W
,而实际上 write
是弱的)fputc
(或 malloc
)是合法的(并且可能很有用,但非常棘手),只要它保持符合标准的语义。更一般地说,预期可以重新定义弱符号(但这很棘手)。由于唯一可能给您一些警告的东西不是编译器(它不知道在运行时会使用哪个特定的libc
,您可能会在编译后升级libc.so
),而是链接器,更确切地说是动态链接器,即ld-linux(8)。警告只能在运行时可靠地给出(因为libc.so
在构建时和运行时可能不同)。也许您需要LD_DYNAMIC_WEAK
。
libc
中重新定义弱符号时发出警告(这种检查的实用性有限,因为可能与运行时动态链接的 libc
不同)。LD_PRELOAD
trick。libc
函数。
gcc
。 - Basile Starynkevitchfputc
。 - Basile Starynkevitch