On Tue, Dec 13, 2016 at 11:03:53AM -0800, Junio C Hamano wrote:

> >> @@ -1525,12 +1526,10 @@ static int git_commit_config(const char *k, const 
> >> char *v, void *cb)
> >>  static int run_rewrite_hook(const unsigned char *oldsha1,
> >>                        const unsigned char *newsha1)
> >>  {
> >> -  /* oldsha1 SP newsha1 LF NUL */
> >> -  static char buf[2*40 + 3];
> >> +  char *buf;
> >>    struct child_process proc = CHILD_PROCESS_INIT;
> >>    const char *argv[3];
> >>    int code;
> >> -  size_t n;
> >>  
> >>    argv[0] = find_hook("post-rewrite");
> >>    if (!argv[0])
> >> @@ -1546,34 +1545,33 @@ static int run_rewrite_hook(const unsigned char 
> >> *oldsha1,
> >>    code = start_command(&proc);
> >>    if (code)
> >>            return code;
> >> -  n = snprintf(buf, sizeof(buf), "%s %s\n",
> >> -               sha1_to_hex(oldsha1), sha1_to_hex(newsha1));
> >> +  buf = xstrfmt("%s %s\n", sha1_to_hex(oldsha1), sha1_to_hex(newsha1));
> >>    sigchain_push(SIGPIPE, SIG_IGN);
> >> -  write_in_full(proc.in, buf, n);
> >> +  write_in_full(proc.in, buf, strlen(buf));
> >>    close(proc.in);
> >> +  free(buf);
> >
> > Any time you care about the length of the result, I'd generally use an
> > actual strbuf instead of xstrfmt. The extra strlen isn't a big deal
> > here, but it somehow seems simpler to me. It probably doesn't matter
> > much either way, though.
> 
> Your justification for this extra allocation was that it is a
> heavy-weight operation.  While I agree that the runtime cost of
> allocation and deallocation does not matter, I would be a bit
> worried about extra cognitive burden to programmers.  They did not
> have to worry about leaking because they are writing a fixed length
> string.  Now they do, whether they use xstrfmt() or struct strbuf.
> When they need to update what they write, they do have to remember
> to adjust the size of the "fixed string", and the original is not
> free from the "programmers' cognitive cost" point of view, of
> course.  Probably use of strbuf/xstrfmt is an overall win.

So I think you are agreeing, but I have a minor nit to pick. :)

The fact that the extra allocation will not hurt performance is
_necessary_, but not _sufficient_. So it's not a justification in
itself, only something we have to check before proceeding.

The only justification here is that magic numbers like "2*40 + 3" are
confusing and a potential maintenance burden. And that's why I suggested
splitting this one out from the other two (whose justification is
"PATH_MAX is sometimes too small").

I agree with you that it's a tradeoff between "magic numbers" versus
"having to free resources". In my opinion it's a net improvement, but I
think it would also be reasonable to switch to xsnprintf() here. Then
the programmer has an automatic check that the buffer size is
sufficient.

-Peff

Reply via email to