From: Jeff King <peff@peff.net>
To: Jonathan Nieder <jrnieder@gmail.com>
Cc: Junio C Hamano <gitster@pobox.com>,
Stefan Beller <sbeller@google.com>,
git@vger.kernel.org, Michael Haggerty <mhagger@alum.mit.edu>
Subject: Re: [PATCH 03/14] copy_fd: pass error message back through a strbuf
Date: Thu, 4 Dec 2014 02:59:20 -0500 [thread overview]
Message-ID: <20141204075920.GA27142@peff.net> (raw)
In-Reply-To: <20141203213858.GC6527@google.com>
On Wed, Dec 03, 2014 at 01:38:58PM -0800, Jonathan Nieder wrote:
> > What about a struct that has an errno-like value _and_ a fixed-size
> > buffer? I'm thinking something like:
> >
> > struct error {
> > int code;
> > char msg[1024];
> > };
>
> My experience with errno is that it is very hard to anticipate what
> granularity to use with error codes, especially if the error code is
> going to (in some contexts) determine the message printed to the user.
> In practice, it is easier to come up with a message at the error
> detection site and use a generic "something happened" error code
> except in those places where the caller is going to act on specific
> error types that need to be distinguished.
Yeah, I agree. I think error.msg there would be the main use, and
error.code is just gravy. I agree it could simply come back through the
integer return value, too.
> The "< 0 means error" convention gives room to use different exit
> codes for the errors that need to be programmatically distinguished.
> For example, the ref transaction API uses this to distinguish D/F
> conflicts from other errors, while still returning an error message
> through a strbuf output parameter.
Yup. One nice thing about stuffing it into the error struct is that it
saves the caller from declaring a separate variable (assuming they need
"err" anyway to collect the message). I.e.:
struct error err;
if (some_func(fd, &err))
react_to(err.code);
as opposed to:
struct error err;
int ret;
ret = some_func(fd, &err);
if (ret)
react_to(ret);
But I think it's a minority of cases where we care about the specific
value anyway, so it's probably not a big deal either way.
> > If we changed the strbuf to a fixed-size buffer, that would help the
> > allocation issue. Some messages might be truncated, but it seems
> > unlikely in practice. It still loses readability, though.
>
> I don't like the idea of having to choose a size in advance and not
> being able to fit more detailed (perhaps language-specific, and
> including user-specified input) messages lest the buffer overflow.
Is that really a problem in practice? Is a message larger than 1024
characters actually readable? It would have to be broken across many
lines, and then I think we are no longer dealing with an error message,
but some advice (which probably shouldn't go through this mechanism
anyway).
> The allocation of a variable-sized buffer is a small overhead that I
> don't mind incurring on error. In the non-error case, the caller
> doesn't actually have to free the buffer, and if they choose to, the
> overhead incurred is that of free(NULL)'.
I don't care at all about overhead. I care about extra work on the part
of the caller to avoid a leak. It turns:
if (some_func(fd, &err))
return error("%s", err.msg);
into:
if (some_func(fd, &err)) {
error("%s", err.buf);
strbuf_release(&err);
return -1;
}
It may make things a little easier when an intermediate function has
to further munge the message. For example, your 04/14 uses
strbuf_prefixf. But that can also be expressed in a buffer world as:
/* "parent_err" is passed to us from caller, "err" is a local buffer */
if (copy_fd(orig, fd, &err))
return mkerror(&parent_err, "cannot copy '%s': %s", path, err.msg);
Strbufs make more complicated munging possible, but I'd expect prefixing
to be the most common case (except for not munging at all, which I think
is even more common).
I dunno. I just hate to see a system where it's very easy for callers to
introduce memory leaks by forgetting a strbuf_release, or that bogs
callers down with error-handling boilerplate.
-Peff
next prev parent reply other threads:[~2014-12-04 7:59 UTC|newest]
Thread overview: 83+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-11-17 22:14 [PATCH] copy.c: make copy_fd preserve meaningful errno Stefan Beller
2014-11-17 23:08 ` Junio C Hamano
2014-11-17 23:13 ` Stefan Beller
2014-11-17 23:35 ` Jonathan Nieder
2014-11-18 0:18 ` Stefan Beller
2014-11-18 0:48 ` Jonathan Nieder
2014-11-18 1:01 ` Stefan Beller
2014-12-03 5:02 ` [PATCH 0/14] " Jonathan Nieder
2014-12-03 5:10 ` [PATCH 01/14] strbuf: introduce strbuf_prefixf() Jonathan Nieder
2014-12-03 20:10 ` Eric Sunshine
2014-12-03 20:14 ` Jonathan Nieder
2014-12-03 21:45 ` Junio C Hamano
2014-12-03 21:59 ` Jonathan Nieder
2014-12-03 22:09 ` Jonathan Nieder
2014-12-03 22:40 ` Junio C Hamano
2014-12-03 5:12 ` [PATCH 02/14] add_to_alternates_file: respect GIT_OBJECT_DIRECTORY Jonathan Nieder
2014-12-03 18:53 ` Junio C Hamano
2014-12-03 5:13 ` [PATCH 03/14] copy_fd: pass error message back through a strbuf Jonathan Nieder
2014-12-03 19:01 ` Junio C Hamano
2014-12-03 20:28 ` Jonathan Nieder
2014-12-03 21:00 ` Jeff King
2014-12-03 21:38 ` Jonathan Nieder
2014-12-04 7:59 ` Jeff King [this message]
2014-12-04 8:36 ` Stefan Beller
2014-12-04 9:04 ` Jeff King
2014-12-10 17:02 ` Michael Haggerty
2014-12-10 19:00 ` Junio C Hamano
2014-12-10 19:14 ` Jeff King
2014-12-04 3:01 ` [PATCH/RFC] doc: document error handling functions and conventions (Re: [PATCH 03/14] copy_fd: pass error message back through a strbuf) Jonathan Nieder
2014-12-04 23:27 ` Junio C Hamano
2014-12-04 23:37 ` Jonathan Nieder
2014-12-04 23:41 ` Jonathan Nieder
2014-12-04 23:44 ` Jeff King
2014-12-04 23:52 ` Junio C Hamano
2014-12-05 0:01 ` Jeff King
2014-12-05 18:00 ` Junio C Hamano
2014-12-07 10:07 ` Jeff King
2014-12-09 18:43 ` Junio C Hamano
2014-12-09 18:49 ` Jeff King
2015-02-12 23:08 ` Junio C Hamano
2015-02-17 15:50 ` Michael Haggerty
2015-02-17 16:03 ` Junio C Hamano
2015-02-17 16:05 ` Jeff King
2015-02-17 22:46 ` Junio C Hamano
2014-12-03 20:02 ` [PATCH 03/14] copy_fd: pass error message back through a strbuf Junio C Hamano
2014-12-03 20:18 ` Jonathan Nieder
2014-12-03 21:43 ` Junio C Hamano
2014-12-03 21:51 ` Jonathan Nieder
2014-12-03 20:20 ` Stefan Beller
2014-12-03 5:14 ` [PATCH 04/14] hold_lock_file_for_append: " Jonathan Nieder
2014-12-03 6:09 ` Torsten Bögershausen
2014-12-03 7:04 ` Jonathan Nieder
2014-12-03 5:16 ` [PATCH 05/14] lock_packed_refs: " Jonathan Nieder
2014-12-03 5:19 ` [PATCH 06/14] lockfile: introduce flag for locks outside .git Jonathan Nieder
2014-12-03 23:13 ` Junio C Hamano
2014-12-03 23:24 ` Jonathan Nieder
2014-12-03 23:25 ` Junio C Hamano
2014-12-03 23:29 ` Jonathan Nieder
2014-12-03 23:38 ` Junio C Hamano
2014-12-03 23:41 ` Jonathan Nieder
2014-12-03 23:43 ` Junio C Hamano
2014-12-03 23:57 ` Jeff King
2014-12-04 5:51 ` Junio C Hamano
2014-12-04 17:56 ` Jonathan Nieder
2014-12-03 5:19 ` [PATCH 07/14] fast-import: use message from lockfile API when writing marks fails Jonathan Nieder
2014-12-03 5:20 ` [PATCH 08/14] credentials: use message from lockfile API when locking ~/.git-credentials fails Jonathan Nieder
2014-12-03 5:21 ` [PATCH 09/14] config: use message from lockfile API when locking config file fails Jonathan Nieder
2014-12-03 19:59 ` Junio C Hamano
2014-12-03 20:16 ` Jonathan Nieder
2014-12-03 5:22 ` [PATCH 10/14] rerere: error out on autoupdate failure Jonathan Nieder
2014-12-03 5:25 ` [PATCH 11/14] hold_locked_index: pass error message back through a strbuf Jonathan Nieder
2014-12-03 5:26 ` [PATCH 12/14] hold_lock_file_for_update: " Jonathan Nieder
2014-12-03 18:53 ` Jonathan Nieder
2014-12-03 5:26 ` [PATCH 13/14] lockfile: remove unused function 'unable_to_lock_die' Jonathan Nieder
2014-12-03 5:27 ` [PATCH 14/14] lockfile: make 'unable_to_lock_message' private Jonathan Nieder
2014-12-03 20:42 ` Stefan Beller
2014-11-18 16:32 ` [PATCH] copy.c: make copy_fd preserve meaningful errno Junio C Hamano
2014-11-18 17:08 ` Junio C Hamano
2014-11-21 9:14 ` Michael Haggerty
2014-11-21 9:17 ` Michael Haggerty
2014-11-21 17:48 ` Junio C Hamano
2014-11-21 17:54 ` Jeff King
2014-11-21 18:31 ` Junio C Hamano
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20141204075920.GA27142@peff.net \
--to=peff@peff.net \
--cc=git@vger.kernel.org \
--cc=gitster@pobox.com \
--cc=jrnieder@gmail.com \
--cc=mhagger@alum.mit.edu \
--cc=sbeller@google.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.