From: Junio C Hamano <gitster@pobox.com>
To: Marat Radchenko <marat@slonopotamus.org>
Cc: git@vger.kernel.org
Subject: Re: [PATCH v3] MSVC: fix t0040-parse-options crash
Date: Sat, 29 Mar 2014 19:01:54 -0700 [thread overview]
Message-ID: <7vtxago359.fsf@alter.siamese.dyndns.org> (raw)
In-Reply-To: <1396123762-28673-1-git-send-email-marat@slonopotamus.org> (Marat Radchenko's message of "Sun, 30 Mar 2014 00:09:22 +0400")
Marat Radchenko <marat@slonopotamus.org> writes:
> On 64-bit MSVC, pointers are 64 bit but `long` is only 32.
> Thus, casting string to `unsigned long`, which is redundand on other
> platforms, throws away important bits and when later cast to `intptr_t`
> results in corrupt pointer.
>
> This patch fixes test-parse-options by replacing harming cast with
> correct one.
>
> Signed-off-by: Marat Radchenko <marat@slonopotamus.org>
> ---
>
> Aargh! Didn't notice that V2 introduced compilation warning. Take three.
I am glad that I asked you to clarify, as I totally forgot that
there are L32P64 boxes.
I love it every time to see an attempt to describe why the solution
works clearly results in a better patch. It is not about writing
verbose log message; it is about thinking things through and clearly
cut to the core of the issue. Moving the string literal to a
separate variable to be used in the constructor in v1 was totally a
red-herring. Your updated log message makes it crystal clear that
using the correct typecast, not "unsigned long" but "intptr_t", is
the core of the solution.
As OPT_SET_PTR() is about setting the pointer value to intptr_t defval,
a follow-up patch on top of this fix (see attached) may not be a bad
thing to have, but that patch alone will not fix this issue without
dropping the unneeded and unwanted cast to unsigned long.
Thanks.
> test-parse-options.c | 2 +-
> 1 file changed, 1 insertion(+), 1 deletion(-)
>
> diff --git a/test-parse-options.c b/test-parse-options.c
> index 434e8b8..6f6c656 100644
> --- a/test-parse-options.c
> +++ b/test-parse-options.c
> @@ -60,7 +60,7 @@ int main(int argc, char **argv)
> OPT_STRING('o', NULL, &string, "str", "get another string"),
> OPT_NOOP_NOARG(0, "obsolete"),
> OPT_SET_PTR(0, "default-string", &string,
> - "set string to default", (unsigned long)"default"),
> + "set string to default", (intptr_t)"default"),
> OPT_STRING_LIST(0, "list", &list, "str", "add str to list"),
> OPT_GROUP("Magic arguments"),
> OPT_ARGUMENT("quux", "means --quux"),
parse-options.h | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/parse-options.h b/parse-options.h
index d670cb9..7a24d2e 100644
--- a/parse-options.h
+++ b/parse-options.h
@@ -129,7 +129,7 @@ struct option {
#define OPT_HIDDEN_BOOL(s, l, v, h) { OPTION_SET_INT, (s), (l), (v), NULL, \
(h), PARSE_OPT_NOARG | PARSE_OPT_HIDDEN, NULL, 1}
#define OPT_SET_PTR(s, l, v, h, p) { OPTION_SET_PTR, (s), (l), (v), NULL, \
- (h), PARSE_OPT_NOARG, NULL, (p) }
+ (h), PARSE_OPT_NOARG, NULL, (intptr_t)(p) }
#define OPT_CMDMODE(s, l, v, h, i) { OPTION_CMDMODE, (s), (l), (v), NULL, \
(h), PARSE_OPT_NOARG|PARSE_OPT_NONEG, NULL, (i) }
#define OPT_INTEGER(s, l, v, h) { OPTION_INTEGER, (s), (l), (v), N_("n"), (h) }
next prev parent reply other threads:[~2014-03-30 2:00 UTC|newest]
Thread overview: 17+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-03-28 12:04 [PATCH] MSVC: fix t0040-parse-options Marat Radchenko
2014-03-28 18:19 ` Junio C Hamano
2014-03-29 19:59 ` [PATCH v2] MSVC: fix t0040-parse-options crash Marat Radchenko
2014-03-29 20:09 ` [PATCH v3] " Marat Radchenko
2014-03-29 21:34 ` Andreas Schwab
2014-03-29 22:17 ` René Scharfe
2014-03-30 2:01 ` Junio C Hamano [this message]
2014-03-30 8:29 ` Andreas Schwab
2014-03-31 21:09 ` Jeff King
2014-03-30 11:08 ` [PATCH v4 0/3] Take four on fixing OPT_SET_PTR issues Marat Radchenko
2014-03-30 11:08 ` [PATCH v4 1/3] MSVC: fix t0040-parse-options crash Marat Radchenko
2014-03-30 11:08 ` [PATCH v4 2/3] parse-options: add cast to correct pointer type to OPT_SET_PTR Marat Radchenko
2014-03-31 17:16 ` Junio C Hamano
2014-03-30 11:08 ` [PATCH v4 3/3] parse-options: remove unused OPT_SET_PTR Marat Radchenko
2014-03-31 17:23 ` [PATCH v4 0/3] Take four on fixing OPT_SET_PTR issues Junio C Hamano
2014-03-31 21:07 ` Jeff King
2014-03-31 22:54 ` 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=7vtxago359.fsf@alter.siamese.dyndns.org \
--to=gitster@pobox.com \
--cc=git@vger.kernel.org \
--cc=marat@slonopotamus.org \
/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.