On Mon, Jun 13, 2016 at 07:08:55AM +0700, Duy Nguyen wrote: > > So if we are doing the conservative thing, then I think the resulting > > code should either look like: > > > > if (!v->strdup_strings) > > die("BUG: OPT_STRING_LIST should always use strdup_strings"); > > string_list_append(v, arg); > > I agree with the analysis. But this die() would hit all callers > (except interpret-trailers) because they all initialize with _NODUP > and setting strdup_strings may require auditing all access to the > string list in question, e.g. to change string_list_append(v, > xstrdup(xxx)) to string_list_append(xxx). it may cause side effects if > we are not careful. Yep. It is not really fixing anything, so much as alerting us to broken callers. We'd still have to fix the callers. :) > So far all callers are in builtin/, I think it will not take much time > to verify that they all call parse_options() with global argv, then we > can just lose extra xstrdup() and stick to string_list_append(). > OPTION_STRING already assumes that argument strings are stable because > they are passed back as-is. Can we go with an easier route, adding a > comment on top of parse_options() stating that argv[] pointers may be > passed back as-is and it's up to the caller to xstrdup() appropriately > before argv[] memory is freed? Yeah, the two options I laid out were the "conservative" side, where we didn't make any assumptions about what is in passed into parse_options. But I agree in practice that it's not likely to be a problem to just point to the existing strings, and the fact that OPTION_STRING does so already makes me even more confident. So I'd suggest these patches: [1/3]: parse_opt_string_list: stop allocating new strings [2/3]: interpret-trailers: don't duplicate option strings [3/3]: blame,shortlog: don't make local option variables static The first one is what we've been discussing, and the others are just follow-on cleanups. I stopped short of a fourth patch to convert more cases of: static struct string_list foo; to: static struct string_list foo = STRING_LIST_INIT_NODUP; The two are equivalent (mostly due to historical reasons). I tend to think explicit is better than implicit for something like this (not because BSS auto-initialization isn't OK, but because there is an explicit choice of dup/nodup that the writer made, and it is good to communicate that). But maybe people don't want the extra noise. -Peff -- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html