Keep in mind that assert() can be compiled out if NDEBUG is defined.  I
don't think that this is done very often, however.

I've seen some places in the code where there is an assert() followed by an
abort().

tom

Steve Peng writes:
> 
> David,
> 
> Ok I will go ahead assert in backend_switch_copy().  I will send out 
> another increment webrev once it is ready.
> 
> Thanks
> 
> Steve
> 
> David Bustos wrote:
> > Quoth Steve Peng on Thu, Feb 14, 2008 at 10:58:14AM -0700:
> >   
> >> David Bustos wrote:
> >>     
> >>> backend_switch() no longer fails with _TRUNCATED, so please remove it
> >>> from repository_switch()'s comment.
> >>>       
> >> Line 1172 in backend_switch_copy possibly can return _TRUNCATED error 
> >> hence backend_switch can return the same
> >> error.
> >>     
> >
> > Not if you assert() that backend_switch_copy() doesn't fail with
> > _TRUNCATED.  If it does, we'll abort and the caller of backend_switch()
> > will never see the error.
> >
> >   
> >>>>> cmd/svc/configd/backend.c
> >>>>>           
> >>> ...
> >>>       
> >>>>>   1302: Shouldn't you assert() that this doesn't fail with _TRUNCATED
> >>>>>     since you know that dst is much shorter than PATH_MAX?
> >>>>>       
> >>>>>           
> >>>> I can add that.
> >>>>         
> >>> Then you should also fix backend_switch()'s comment to say that it can
> >>> return the error codes from backend_switch_copy() except for _TRUNCATED.
> >>> Though I think it would be better to just list the errors outright.
> >>>       
> >> Look into more I think I should back out assertion since strcat in 
> >> backend_switch_copy can possibly fail with _TRUNCATE even
> >> it may not happen but I like to be more cautious.
> >>     
> >
> > No, we can prove that it can't happen.  It doesn't depend on the value
> > of sw_back, it depends on REPOSITORY_DB, FAST_REPOSITORY_DB, PATH_MAX,
> > and the code of backend_switch_copy(), all of which are either standard
> > or are compiled into the binary.  It means that somebody changed one of
> > those things in an uncorrelated way and is testing it.  Rather than
> > passing an error up the stack which eventually results in a strange
> > error message, you should abort() as soon as we know it's a programming
> > error.  (Some would even argue that you could assert() when strlcat()
> > fails in backend_switch_copy().)  This will make debugging easier and
> > eliminates an error case for the calling code.
> >
> > If you want to make the assumptions more explicit, you could calculate
> > how long dst has to be before backend_switch_copy() returns _TRUNCATED
> > and document it in the comment.  Then you could add
> > assert(strlen(dst) < /* computed number */) to backend_switch().  And
> > you could even add a comment to the definition of REPOSITORY_DB and
> > FAST_REPOSITORY_DB saying that it shouldn't be made any longer than your
> > computed number.  I don't think it's worth it for such specialized code
> > in the same file, though.
> >
> >
> > David
> >   
> 
> _______________________________________________
> smf-discuss mailing list
> smf-discuss at opensolaris.org

Reply via email to