Jeff King <[email protected]> writes:
> I've looked into it before, but that causes its own wave of headaches.
> The source of the problem is that we do:
>
> const char *some_var = "default";
> ...
> git_config_string(&some_var, ...);
Yup, that is a valid pattern for "run once and let exit(3) clean
after us" programs.
> Doing it "right" in C would probably involve two variables:
>
> const char *some_var = "default";
> const char *some_var_storage = NULL;
>
> int git_config_string_smart(const char **ptr, char **storage,
> const char *var, const char *value)
> {
> ...
> free(*storage);
> *ptr = *storage = xstrdup(value);
> return 0;
> }
>
> #define GIT_CONFIG_STRING(name, var, value) \
> git_config_string_smart(&(name), &(name##_storage), var, value)
>
> Or something like that.
The attitude the approach takes is that "run once and let exit(3)
clean after us" programs *should* care. And at that point, maybe
char *some_var = xstrdup("default");
git_config_string(&some_var, ...);
that takes "char **" and frees the current storage before assigning
to it may be simpler than the two-variable approach.
But you're right. We cannot just unconst the type and be done with
it---there are associated clean-up necessary if we were to do this.
Thanks.