您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

为什么glibc的fclose(NULL)会导致分段错误而不是返回错误?

为什么glibc的fclose(NULL)会导致分段错误而不是返回错误?

fclose要求作为其参数一个FILE指针通过获得任一fopen,标准流中的一个stdinstdoutstderr,或在一些其它实现定义方式。空指针不是其中之一,因此行为是不确定的,就像是fclose((FILE *)0xdeadbeef)这样。 在C语言中 ;除了一个事实,即它保证比较不等于任何有效的指针,它只是像任何其他无效的指针,并使用它调用时的界面你将它传递给文件作为合同的一部分,除了不确定的行为NULL具有一定的特殊的意义。

此外,返回错误将是有效的(因为无论如何该行为都是未定义的),但是对于实现来说是有害的,因为它 隐藏了未定义的行为调用未定义行为的最佳结果始终是崩溃,因为它会突出显示错误并允许您对其进行修复。的大多数用户fclose不会检查错误的返回值,因此我敢打赌大多数人会愚蠢到要传递NULLfclose,而他们不会足够聪明地检查的返回值fclose。由于最终的刷新可能会失败,因此人们可能会争辩说人们通常应该 检查的返回值fclose,但是对于仅用于读取而打开的文件,或者如果fflush之前被手动调用文件,则不需要这样做。fclose(无论如何这都是一个更聪明的习惯,因为在打开文件的同时更容易处理错误)。

其他 2022/1/1 18:13:49 有625人围观

撰写回答


你尚未登录,登录后可以

和开发者交流问题的细节

关注并接收问题和回答的更新提醒

参与内容的编辑和改进,让解决方法与时俱进

请先登录

推荐问题


联系我
置顶