标题非常清楚:使用basename(man 3 basename)是否安全__FILE__?
它编译并且似乎工作正常,但是 basename参数是char*(不是const char*),- manpage表示:
dirname()和basename()都可以修改path的内容,因此在调用其中一个函数时可能需要传递一个副本.
所以,这让我担心.
也许问题应该更像:什么类型的__FILE__?这不是字符串文字/ const char*?但如果是,为什么没有编译时错误(const char*to char*)?
仔细 阅读basename(3)并注意:
警告:有两种不同的功能
basename()- 见下文.
并照顾NOTES说
有两个不同的版本
basename()- 上面描述的POSIX版本,以及GNU版本,后者可以使用Run Code Online (Sandbox Code Playgroud)#define _GNU_SOURCE /* See feature_test_macros(7) */ #include <string.h>GNU版本从不修改其参数,并在路径具有尾部斜杠时返回空字符串
(重点是我的)
因为据说GNU版本没有修改它的参数,所以使用它是安全的 __FILE__
顺便说一句,您可以考虑自定义GCC(例如使用MELT)来定义一些__builtin_basename在编译时计算基本名称的内容,如果给定字符串文字__FILE__或basename在运行时调用.
请注意,libgen.h有#define basename __xpg_basename
\n\n\n__FILE__ 的类型是什么?它不是一个字符串文字/const char* 吗?
\n
是的。这是一个字符串文字。
\n\n\n\n\n但如果是的话,为什么没有编译时错误(const char* 到 char*)?
\n
可能是因为您使用的实现(glibc's)可能会在您传递的字符串文字中返回一个指针(即它不会修改其输入)。\n无论如何,您都不能依赖它来实现上面叙述如下。
\n\nC 标准 (c11, \xc2\xa7 6.10.8.1) 表示这__FILE__是一个字符串文字:
\n\n\n\n
__FILE__当前源的假定名称 \xef\xac\x81le (字符串站点)。
POSIX说:
\n\n\n\n\nbasename() 函数可以修改 path 指向的字符串,并且可以返回指向内部存储的指针。返回的指针可能会失效,或者存储可能会被后续调用 basename() 覆盖。
\n
(强调我的)。
\n\nbasename()所以,不,使用拨打电话并不安全__FILE__。您只需复制一份__FILE__并basename()对其进行操作即可:
char *filename = strdup(__FILE__);\nif (filename) {\n /* error */\n}\nchar *file_basename = basename(filename);\nfree(filename);\nRun Code Online (Sandbox Code Playgroud)\n\n由于__FILE__是字符串文字,使用数组是另一种选择:
char filename[] = __FILE__;\nchar *file_basename = basename(filename);\nRun Code Online (Sandbox Code Playgroud)\n
| 归档时间: |
|
| 查看次数: |
847 次 |
| 最近记录: |