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

From: junio@siamese.dyndns.org
Date: Wed Aug 28 2002 - 19:49:51 EST


>>>>> "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/



This archive was generated by hypermail 2b29 : Sat Aug 31 2002 - 22:00:25 EST