Subject: Re: segmentation fault on fclose?
To: None <current-users@NetBSD.ORG>
From: der Mouse <mouse@Collatz.McRCIM.McGill.EDU>
List: current-users
Date: 09/06/1994 10:10:27
>>> Just two questions...  Should the following code cause a
>>> segmentation fault?
>>>    fp = NULL;
>>>    fclose(fp);

>> ANSI does not require such a special case, and I really don't like
>> the idea of masking bugs in applications by kluging up the C
>> library.

I'm with you all the way here.

> I considered advocating checking for NULL in fclose, but it occured
> to me I would actually rather that my program dump core, as a warning
> to me that I was closing a file twice, closing a file that was never
> open, or somehow not handling a file correctly in some other way,
> rather than blindly continue on.  I would consider that segmentation
> fault to be a debugging aid.

Me too.  If I might offer a somewhat programmer-friendlier debugging
aid,

	fclose(NULL) called
	Software abort (core dumped)
	% 

might be preferred over

	Segmentation fault (core dumped)
	% 

and having to fire up a debugger to discover where it died.  Something
like this, perhaps:

	fclose(FILE *fp)
	{
	 if (! fp)
	  { write(2,"fclose(NULL) called\r\n",21);
	    kill(getpid(),SIGABRT);
	  }
	 ....
	}

I don't recommend calling abort() because that has a nasty tendency to
try to fclose() everything, which may be the last thing you want in a
case like this.  (At least it does on our Suns.  I haven't looked at
NetBSD abort().)

Of course, carrying this to its logical extreme would have every libc
routine that takes a pointer argument checking for nil pointers.  A
good case could be made that it's excessive, and I don't really see
anything wrong with the current behavior.

					der Mouse

			    mouse@collatz.mcrcim.mcgill.edu

------------------------------------------------------------------------------