Re: [TRIVIAL] strlen("literal string") -> (sizeof("literal string")-1)

junio@siamese.dyndns.org
28 Aug 2002 17:49:51 -0700


>>>>> "JT" == Jim Treadway <jim@stardot-tech.com> writes:

JT> Would redefining strlen() as __strlen() and then using

JT> #define strlen(x) (__builtin_constant_p(x) ? (sizeof(x) - 1) : __strlen(x))

JT> work in this situation?

I thought about that before I posted the previous patch, but
rejected it.

If it worked in all situations then it would have been great,
but it fails in at least one way [*1*], so you cannot generally
define the above in a header file which everybody includes.
Instead, you end up examining each use of strlen() and make the
above "#define" only where it does not break; it is not worth
the aggravation. Something named "strlen" must work in all
situations, and "in this situation" is not good enough.
Otherwise it would confuse/surprise people.

[Footnotes]

*1* It fails on the following:

#define FOOBARBAZ &("foobarbaz"[0])

void
main(void) {
int sz;
if (__builtin_constant_p(FOOBARBAZ)) {
sz = sizeof(FOOBARBAZ) - 1;
printf("sizeof(FOOBARBAZ) -1 = %d\n", sz);
}
printf("strlen(FOOBARBAZ) = %d\n", strlen(FOOBARBAZ));
exit(0);
}

-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/