bug-gnulib
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: warn-on-use preview


From: Bruno Haible
Subject: Re: warn-on-use preview
Date: Fri, 1 Jan 2010 15:11:00 +0100
User-agent: KMail/1.9.9

Hi Eric,

Eric Blake wrote:
> I won't push this until it's had a bit longer for reviews.

Yes, for reviewing 4 patches like this you need to give me a day at least.

>       [1/4] warn-on-use: new module

The recommendation how to deal with variables like 'environ':

  static inline char ***rpl_environ (void) { return &environ; }
  # define environ (*rpl_environ ())

will not work when a program does

  static char*** foo = &environ;

but this is a rare case that will probably not occur. So that's fine.

The implementation of gl_WARN_ON_USE_PREPARE looks strange and brittle to me,
when some header is implied that interferes with another header. Say, I write

   gl_WARN_ON_USE_PREPARE([locale.h], [setlocale])
   gl_WARN_ON_USE_PREPARE([libintl.h], [gettext])

then it will check for setlocale using

   AC_COMPILE_IFELSE([AC_LANG_PROGRAM([
     #include <locale.h>
     #include <libintl.h>
     #undef setlocale
     (void) setlocale;
   ])])

which may or may not be the same as the intended

   AC_COMPILE_IFELSE([AC_LANG_PROGRAM([
     #include <locale.h>
     #undef setlocale
     (void) setlocale;
   ])])

I would prefer an implementation where the expansion of
  gl_WARN_ON_USE_PREPARE([locale.h], [setlocale])
does not depend on other invocations of gl_WARN_ON_USE_PREPARE, even if it
leads to a larger 'configure' file.

>       [2/4] stdio: warn on suspicious uses
> ... Also, rewrite the ftell/ftello warnings.  I almost feel 
> bad that the commit log is about as long as the patch.

Yes, some of the commit log would make sense as a comment in stdio.in.h.

> +   In other words, _GL_NO_LARGE_FILES is a witness macro that states
> +   that arbitrarily limiting to 32-bit offsets is safe for a given
> +   program

Here I would say "... safe for a given compilation unit". The
_GL_NO_LARGE_FILES macro is often applied to only some compilation units
among a program.

>  AC_DEFUN([gl_STDIO_H],
>  [
> +  AC_REQUIRE([AC_C_INLINE])
>    AC_REQUIRE([gl_STDIO_H_DEFAULTS])
>    gl_CHECK_NEXT_HEADERS([stdio.h])

Could you insert the AC_C_INLINE line one line below? The common idiom wants
that AC_REQUIRE([gl_STDIO_H_DEFAULTS]) is the very first thing inside
gl_STDIO_H.

> --- a/tests/test-freadable.c
> +++ b/tests/test-freadable.c
> @@ -20,16 +20,13 @@
> 
>  #include "freadable.h"
> 
> +/* None of the files accessed by this test are large, so disable the
> +   fseek link warning if we are not using the gnulib fseek module.  */
> +#define _GL_NO_LARGE_FILES

These added lines should come between #include <config.h> and
#include "freadable.h", because the latter may include <stdio.h>, and
setting _GL_NO_LARGE_FILES after you have already included <stdio.h> has
no effect.

Likewise in tests/test-freading.c, tests/test-fwritable.c, 
tests/test-fwriting.c,
tests/test-getopt.c. 

>       [3/4] unistd: warn on use of environ without module

Looks fine.

>       [4/4] math: add portability warnings for classification macros

> +#define _GL_WARN_REAL_FLOATING_DECL(func) \
> +static inline int                                                   \
> +rpl_ ## func (float f, double d, long double l, int which)          \
> +{                                                                   \
> +  switch (which)                                                    \
> +    {                                                               \
> +    case 1: return func (f);                                        \
> +    case 2: return func (d);                                        \
> +    default: return func (l);                                       \
> +    }                                                               \
> +}                                                                   \
> +_GL_WARN_ON_USE (rpl_ ## func, #func " is unportable - "            \
> +                 "use gnulib module " #func " for portability")
> +#define _GL_WARN_REAL_FLOATING_IMPL(func, value) \
> +  ({                                                                \
> +    __typeof__ (value) __x = (value);                               \
> +    rpl_ ## func (__x, __x, __x,                                    \
> +                  (sizeof __x == sizeof (float) ? 1                 \
> +                   : sizeof __x == sizeof (double) ? 2 : 3));       \
> +  })

There is some risk that this leads to link errors or warnings on some
systems where 'long double' is not correctly supported. For example, on HP-UX,
the isinf or some similar macro refers to an undefined symbol when used on a
'long double'. And on MacOS X 10.3.x, any use of 'long double' leads to a
warning.

Therefore I think it is safer to write this using 3 separate inline functions
for 'float', 'double', and 'long double':

#define _GL_WARN_REAL_FLOATING_DECL(func) \
static inline int                                                   \
rpl_ ## func ## _f (float x)                                        \
{                                                                   \
  return func (x);                                                  \
}                                                                   \
static inline int                                                   \
rpl_ ## func ## _d (double x)                                       \
{                                                                   \
  return func (x);                                                  \
}                                                                   \
static inline int                                                   \
rpl_ ## func ## _l (long double x)                                  \
{                                                                   \
  return func (x);                                                  \
}                                                                   \
_GL_WARN_ON_USE (rpl_ ## func ## _f, #func " is unportable - "      \
                 "use gnulib module " #func " for portability")     \
_GL_WARN_ON_USE (rpl_ ## func ## _d, #func " is unportable - "      \
                 "use gnulib module " #func " for portability")     \
_GL_WARN_ON_USE (rpl_ ## func ## _l, #func " is unportable - "      \
                 "use gnulib module " #func " for portability")     \
#define _GL_WARN_REAL_FLOATING_IMPL(func, value) \
  ({                                                                \
    __typeof__ (value) __x = (value);                               \
    (sizeof __x == sizeof (float) ? rpl_ ## func ## _f (__x) :      \
     sizeof __x == sizeof (double) ? rpl_ ## func ## _d (__x) :     \
     rpl_ ## func ## _l (__x));                                     \
  })

Bruno





reply via email to

[Prev in Thread] Current Thread [Next in Thread]