Re: [PATCH v3] MSVC: fix t0040-parse-options crash

2014-03-31 Thread Jeff King
On Sun, Mar 30, 2014 at 10:29:04AM +0200, Andreas Schwab wrote:

 Junio C Hamano gits...@pobox.com writes:
 
  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.
 
 Wouldn't it make sense to change defval into a union to avoid the cast?
 (The intptr_t type may be too narrow for other values to be put there.)

The primary function of these structs is to capture the information
found in brace initializers.  Is it possible in C89 to initialize the
second member of a union (I think in C99, you can use named
initializers).

-Peff
--
To unsubscribe from this list: send the line unsubscribe git in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [PATCH v3] MSVC: fix t0040-parse-options crash

2014-03-30 Thread Andreas Schwab
Junio C Hamano gits...@pobox.com writes:

 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.

Wouldn't it make sense to change defval into a union to avoid the cast?
(The intptr_t type may be too narrow for other values to be put there.)

Andreas.

-- 
Andreas Schwab, sch...@linux-m68k.org
GPG Key fingerprint = 58CA 54C7 6D53 942B 1756  01D3 44D5 214B 8276 4ED5
And now for something completely different.
--
To unsubscribe from this list: send the line unsubscribe git in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[PATCH v3] MSVC: fix t0040-parse-options crash

2014-03-29 Thread Marat Radchenko
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 ma...@slonopotamus.org
---

Aargh! Didn't notice that V2 introduced compilation warning. Take three.

 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),
-- 
1.9.0

--
To unsubscribe from this list: send the line unsubscribe git in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [PATCH v3] MSVC: fix t0040-parse-options crash

2014-03-29 Thread Andreas Schwab
Marat Radchenko ma...@slonopotamus.org writes:

 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),

Why doesn't OPT_SET_PTR take a pointer?

Andreas.

-- 
Andreas Schwab, sch...@linux-m68k.org
GPG Key fingerprint = 58CA 54C7 6D53 942B 1756  01D3 44D5 214B 8276 4ED5
And now for something completely different.
--
To unsubscribe from this list: send the line unsubscribe git in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [PATCH v3] MSVC: fix t0040-parse-options crash

2014-03-29 Thread René Scharfe

Am 29.03.2014 22:34, schrieb Andreas Schwab:

Marat Radchenko ma...@slonopotamus.org writes:


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),


Why doesn't OPT_SET_PTR take a pointer?


Good question.  Here's another: OPT_SET_PTR (and OPTION_SET_PTR) has 
only ever been used by test-parse-options; can we remove it?


René

--
To unsubscribe from this list: send the line unsubscribe git in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [PATCH v3] MSVC: fix t0040-parse-options crash

2014-03-29 Thread Junio C Hamano
Marat Radchenko ma...@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 ma...@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) }

--
To unsubscribe from this list: send the line unsubscribe git in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html