Python中的编译警告

2 投票
3 回答
2093 浏览
提问于 2025-04-15 17:45

在Linux机器上编译一个Python文件时,会看到以下警告,但在Solaris机器上编译同样的文件时,就没有这个警告。

/opt/swe/tools/ext/gnu/python-2.3.5_p1/i686-linux2.4/lib/python2.3/config/libpython2.3.a(posixmodule.o)(.text+0x3e9a): In function `posix_tmpnam':
./Modules/posixmodule.c:6138: warning: the use of `tmpnam_r' is dangerous, better use `mkstemp'
/opt/swe/tools/ext/gnu/python-2.3.5_p1/i686-linux2.4/lib/python2.3/config/libpython2.3.a(posixmodule.o)(.text+0x3de9): In function `posix_tempnam':
./Modules/posixmodule.c:6093: warning: the use of `tempnam' is dangerous, better use `mkstemp'

我无法解决上面的警告内容。

有没有人能帮忙呢?

3 个回答

1

你会发现使用libpython2.6.a时也会出现相同的警告,所以建议升级的办法并没有什么帮助。只有升级到Python 3才能消除这些警告(参见Python的bug 1318),但对某些人来说,这并不是一个可行的选择。

避免这个警告的一种方法是链接到一个提供tmpnam_r和tempnam定义的库,这样libpython2.6.a中对它们的使用就会指向你自己的定义,而不是glibc中的真实定义。glibc中的定义会触发警告,因为libc.so中有.gnu.warning.tmpnam_r和.gnu.warning.tempnam的部分。

如果你实际上并不使用os.tempnam()和os.tmpnam(),那么你可以忽略这些警告。

1

你可以试着更新一下你的Python版本,比如更新到2.6.4。

4

你正在使用一个较旧版本的Python。

现在大家都知道,tmpnam这个函数并不安全,因此Linux系统中的库和头文件已经更新,会给你发出警告。不过,它应该还是能编译通过,因为向后兼容性是非常重要的。

Python 2.3开发的时候,大家还没有意识到mktemp是个安全问题,而且mkstemp这个函数可能还没有出现。

Solaris系统可能不会有这个问题,因为在那个平台上,tmpnam可能是安全的,或者你的Solaris版本比较旧。

如果你想去掉这个警告,有几种选择:

  • 升级到更新的Python版本。这是推荐的做法,但如果你的生产系统没有升级的话,可能就做不到。
  • 使用一个旧版本的Linux,这个版本还没有修复这个问题(绝对不推荐!)
  • 把这个警告当成一个普通的警告来看,知道如果你在Python中使用tempfile的逻辑,可能会引发安全问题……
  • 把gcc的警告级别调低,这样就不会给你发警告了 :)

如果可能的话,我建议你升级,如果不行就只能忍受这个警告了。

撰写回答