【问题标题】:How can I set a compiler warning (GNU GCC) when overwriting a weak function覆盖弱函数时如何设置编译器警告(GNU GCC)
【发布时间】:2016-06-17 20:44:49
【问题描述】:

库函数默认设置了弱属性(请参阅 [1]),并且可能会被具有相同签名的函数“覆盖”。 例如printf 内部调用fputc,我可以轻松地声明我的一个函数int fputc(int, FILE *)。 如果发生这种情况,我希望收到编译器警告。

有没有办法告诉编译器在覆盖弱函数时警告我?

[1]https://gcc.gnu.org/onlinedocs/gcc-3.2/gcc/Function-Attributes.html

【问题讨论】:

  • 它不会是编译器警告,而是链接器警告。 BTW GCC3.2 是一个古老的 - 不符合当前 C11 和 C++14 标准的编译器,当前(2016 年 3 月)版本是 GCC5 所以你应该升级你的gcc
  • 被允许 重新定义 fputc,前提是您的定义符合标准(这可能很棘手)
  • 你为什么这么问?你想解决的实际问题是什么?看起来像XY problem...所以请编辑您的问题以解释更多并激发它
  • 我最终否决了这个问题,因为它没有动机(我怀疑有些混乱)而且不是很清楚。
  • 实际上,库函数不太可能被意外覆盖。首先,开发人员应该了解 C 标准库(并且不会意外重用标准中定义的名称)。其次,即使他们重新定义了一个函数,也不太可能具有与标准要求的签名相同的签名。其他重新定义 - 带有良好的签名 - 不会是偶然的,而是故意的。

标签: c gcc compiler-warnings


【解决方案1】:

(我猜你在 Linux 上,并且像往常一样编译和链接你的应用程序,特别是使用 libc.so动态链接

库函数默认设置了weak属性

这并不总是正确的;在我的系统上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)但链接器,更准确地说是 dynamic linker,即 ld-linux(8)。并且警告只能在运行时可靠地给出(因为libc.so 在构建时和运行时可能不同)。也许你想要LD_DYNAMIC_WEAK

如果您准备好花费数周时间研究解决方案,您可以考虑将GCC MELT 与您自己的MELT 扩展一起使用并自定义一个最近 GCC 以发出重新定义编译时可用的来自libc 的弱符号(可能与在运行时动态链接的libc 不同,因此此类检查的用处有限)时发出警告。

也许你可以使用一些LD_PRELOAD trick

此外,如果您静态链接您的应用程序,如果您重新定义 libc 函数,链接器可以为您提供诊断。

另请阅读 Drepper 的 How to Write a Shared Library 和 Levine 的 Linkers & loaders 书。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-30
    • 2020-02-16
    • 2013-02-28
    • 2010-09-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多