0

我在链接时收到以下警告:

/opt/oracle/11.2.0.3/lib/libclntst11.a(cc_memory.o): In function `krb5_mcc_generate_new':
cc_memory.c:(text.unlikely+0xd3d): warning: the use of `mktemp' is dangerous, better use `mkstemp'

我与 `g++ [...] -L/opt/oracle/11.2.0.3/lib -lclntst11 [...]

有没有办法隐藏这个警告?
它污染了构建日志(有几十个使用 Oracle 客户端的可执行文件)。

我知道-isystem要减少来自外部库的警告数量,但这仅适用于标头。

谢谢。

4

2 回答 2

1

我将以下内容放在我的程序中的某个位置(而不是它链接到的库中):

// to silence warnings when linking to libwhatever.a
extern "C" char* mktemp(char*) { __builtin_abort(); }

链接器将优先使用该定义而不是 libc.so 中的定义……但这只有在库从未真正调用过时才可以mktemp!就我而言,我知道我正在链接到引用它的库,但我从不使用调用它的功能。如果您的程序使用的代码确实调用mktemp了,那么它将中止。

另一种选择是提供您自己的定义mktemp,可能使用mkstemp和删除它创建的文件来实现,尽管它仍然具有相同的危险竞争条件mktempmktemp基本上是一个损坏的 API。)

您应该向 Oracle 投诉,因为它提供的库依赖于损坏的 API。

于 2013-07-04T11:02:45.110 回答
-1

有没有办法隐藏这个警告?

当然:从源代码重建libc以将其删除 [警告:这可能需要 root 权限,如果操作不正确,可能会导致系统无法启动]。

不过,你为什么要这样做?如果您理解警告并选择忽略它,那么……忽略它?

如果你不理解警告,你应该。

于 2013-07-04T02:14:43.880 回答