C - fts_open 的 "compar" 参数应该有多稳健?
C - How robust should the "compar" argument to fts_open be?
fts_open 定义为 on the man page 将比较函数作为参数。虽然我知道将错误检查放入函数中是一种很好的做法,但函数的实际期望是什么? FTS 会提供空值作为参数还是会自行检查?
FTS 将仅使用有效指针调用您的函数。即,给定:
int my_compar(const FTSENT **ppx, const FTSENT **ppy) { ... }
ppx
有效,*ppx
有效,**ppx
有效(ppy
同理)。
唯一需要注意的是 **ppx
和 **ppy
FTSENT
的 fts_accpath
、fts_path
和 fts_pathlen
字段不得被访问。
关于一般错误检查:您无法检查指针是否有效。您可以检查空指针,但不能检查未初始化的值、目标不再存在的指针 ("dangling") 等。因此您可以进行的检查无论如何都非常有限。
对于函数参数,调用者有责任提供有效值。在这种情况下,"caller" 是 fts_open
。它的描述只说“[compar
函数] 将两个指向 FTSENT
结构的指针作为参数 ”,意思就是它将传递的内容。如果它希望您处理空指针(或指向空指针的指针),文档会明确说明。
fts_open 定义为 on the man page 将比较函数作为参数。虽然我知道将错误检查放入函数中是一种很好的做法,但函数的实际期望是什么? FTS 会提供空值作为参数还是会自行检查?
FTS 将仅使用有效指针调用您的函数。即,给定:
int my_compar(const FTSENT **ppx, const FTSENT **ppy) { ... }
ppx
有效,*ppx
有效,**ppx
有效(ppy
同理)。
唯一需要注意的是 **ppx
和 **ppy
FTSENT
的 fts_accpath
、fts_path
和 fts_pathlen
字段不得被访问。
关于一般错误检查:您无法检查指针是否有效。您可以检查空指针,但不能检查未初始化的值、目标不再存在的指针 ("dangling") 等。因此您可以进行的检查无论如何都非常有限。
对于函数参数,调用者有责任提供有效值。在这种情况下,"caller" 是 fts_open
。它的描述只说“[compar
函数] 将两个指向 FTSENT
结构的指针作为参数 ”,意思就是它将传递的内容。如果它希望您处理空指针(或指向空指针的指针),文档会明确说明。