优化建议fastdfs api多进行参数检查,也建议fastdfs使用可重入函数

发布于 2022-09-18 05:06:20 字数 2974 浏览 7 评论 0

hi,在使用和测试api过程中发现这几个问题需要你考虑优化的:

1,api的函数未对指针参数进行非NULL判断
例如函数:
int tracker_query_storage_store_without_group(TrackerServerInfo *pTrackerServer,
  TrackerServerInfo *pStorageServer, int *store_path_index)
里面未判断pTrackerServer、pTrackerServer是否为NULL,同事出错重连tracker时把pTrackerServer置为NULL后,自己也忘了判断是否为NULL就调用#define tracker_query_storage_store(pTrackerServer, pStorageServer, \
  store_path_index) \
而导致core dump,所以建议在api中接上参数判断,让fastdfs更健壮,即使使用者忘了还有api这层避免应用崩溃。

2,使用了非线程安全函数
看到fastdfs的代码中还有些线程方面的隐患,具体说是使用了gethostbyname等不可重入函数,应该改为gethostbyname_r更好,当然也有的可重入函数版本如gethostbyaddr_r有些Linux版本不支持,我找了个官方列表http://www.opengroup.org/onlinep ... /xsh_chap02_09.html
,你看看下面列表中的函数哪些可以改成线程安全版本,哪些不需要改并说明一下,包括server和api端,这样大家就可以放心使用:

2.9.1 Thread-Safety
All functions defined by this volume of IEEE Std 1003.1-2001 shall be thread-safe, except that the following functions1 need not be thread-safe.

asctime()
basename()
catgets()
crypt()
ctime()
dbm_clearerr()
dbm_close()
dbm_delete()
dbm_error()
dbm_fetch()
dbm_firstkey()
dbm_nextkey()
dbm_open()
dbm_store()
dirname()
dlerror()
drand48()

ecvt()
encrypt()
endgrent()
endpwent()
endutxent()
fcvt()
ftw()
gcvt()
getc_unlocked()
getchar_unlocked()
getdate()
getenv()
getgrent()
getgrgid()
getgrnam()
gethostbyaddr()
gethostbyname()

gethostent()
getlogin()
getnetbyaddr()
getnetbyname()
getnetent()
getopt()
getprotobyname()
getprotobynumber()
getprotoent()
getpwent()
getpwnam()
getpwuid()
getservbyname()
getservbyport()
getservent()
getutxent()
getutxid()

getutxline()
gmtime()
hcreate()
hdestroy()
hsearch()
inet_ntoa()
l64a()
lgamma()
lgammaf()
lgammal()
localeconv()
localtime()
lrand48()
mrand48()
nftw()
nl_langinfo()
ptsname()

putc_unlocked()
putchar_unlocked()
putenv()
pututxline()
rand()
readdir()
setenv()
setgrent()
setkey()
setpwent()
setutxent()
strerror()
strtok()
ttyname()
unsetenv()
wcstombs()
wctomb()

The ctermid() and tmpnam() functions need not be thread-safe if passed a NULL argument. The wcrtomb() and wcsrtombs() functions need not be thread-safe if passed a NULL ps argument.

Implementations shall provide internal synchronization as necessary in order to satisfy this requirement.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

烦人精 2022-09-25 05:06:20

>> 1,api的函数未对指针参数进行非NULL判断
这个不打算改了。像C的库函数,也不会进行参数检查的。
我们要遵循C语言惯例,呵呵。

>> 2,使用了非线程安全函数
这个我会确认一下。如果不是在多线程中,可以使用线程非安全函数的。

谢谢happy_fastdfs 的反馈和支持!

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文