Abhradeep Chakraborty <chakrabortyabhradeep79@xxxxxxxxx> writes: >> These two calls to optbug() use xstrfmt() to grab allocated pieces >> of memory and pass it as a parameter to the function, which means >> the string is leaked without any chance to be freed. >> >> Do we care? >> >> > if (opts->argh && >> > strcspn(opts->argh, " _") != strlen(opts->argh)) >> > err |= optbug(opts, "multi-word argh should use dash to separate words"); >> >> The existing use of optbug() we see here does not share such a >> problem. > > hmm, I wanted a formatting function to format (i.e. pass the > `opt->help` dynamically) the output string. The existing use of > `optbug()` that you specified has no `%s` formatter; it is a plain > string. That's why I used `xstrfmt()`. Moreover, it was in Ævar's > suggestion[1] - > >> + if (opts->help && ends_with(opts->help, ".")) >> + err |= optbug(opts, xstrfmt("argh should not end with a dot: %s", opts->help)); > > But I think, you're right. There is some memory leakage here. > Should I go with plain strings then? (i.e. "help should not end > with a dot" instead of `xstrfmt("help should not end with a dot: > %s", opts->help)`) Sorry that I've given you a trick question, when I know you are quite new to the community. I think the right answer to "Do we care?" is "In this case, because we are about to call exit(), we don't care. The extra complexity and code necessary to retain the memory we get from xstrfmt and free it is not worth it." It's not like we do this in a loop that iterates unbounded number of times before the exit() happens (in which case we should care). Thanks.