Is there a way to warn or prohibit literal string concatenations such as:
const char *a = "foo" " bar";
I spent hours finding a bug in a big static array that had
const char * a[] = {"foo" "bar"};
instead of
const char * a[] = {"foo", "bar"};
Clang has a warning -Wstring-concatenation that is explicitly designed to catch such bugs:
warning: suspicious concatenation of string literals in an array initialization; did you mean to separate the elements with a comma? [-Wstring-concatenation]
char const *a[] = { "ok", "foo" "bar", "ok"};
^
,
This won't exactly work for the toy example you showed because you need to have several initializers and only miss commas in a couple of places, i.e.:
// no warning
char const *b[] = {"foo" "bar"};
// no warning
char const *c[] = {"ok", "foo" "bar"};
// no warning
char const *d[] = {"foo" "bar", "ok"};
But when you have a large number of initializers in an array and only make a typo in a couple of places, this seems ideal.
Here's a demo.
GCC doesn't appear to have an equivalent warning, but there is a request for it to be added.
Note that this only works for array initialization. Your example of
const char *x = "foo" " bar";
won't be detected by this warning (or any other that I'm aware of).
Also note that enabling this warning may yield a lot of false positives, but you can use it sparingly when trying to catch bugs.