Re: [LTP] [PATCH] Annotate tst_*() helpers with __attribute__ ((format (printf, M, N))) (was: Re: [PATCH] quotactl01: Fix tst_resm() format causing crash)

Subrata Modak
2009-08-28T06:09:46Z

On Thu, 2009-08-27 at 17:29 +0200, Geert Uytterhoeven wrote:
> On Thu, 27 Aug 2009, Geert Uytterhoeven wrote:
> > When the quotactl syscall fails, quotactl01 crashes with a segmentation fault
> > due to an incorrect printf()-style format.
>
> This bug encouraged me to add annotations to the test helpers that take
> printf()-style formats, cfr. the patch below.
>
> It causes a massive amount of compiler warnings, most of them caused by
> TEST_ERRNO being long. According to CVS history, both TEST_RETURN and
> TEST_ERRNO have been changed from int to long to accomodate 64-bit platforms,
> but to me the change of TEST_ERRNO looks bogus.
> As errno is int according to C99, TEST_ERRNO should actually be int too, right?
>
> Note that there are also a few other cases where integers are used on pointer
> type format specifiers. These will cause crashes when the code path is
> executed.
>
> >From 601578f79c05779acefe023fd499726d9fe4ce03 Mon Sep 17 00:00:00 2001
> From: Geert Uytterhoeven <Geert.Uytterhoeven@sonycom.com>
> Date: Thu, 27 Aug 2009 17:08:18 +0200
> Subject: [PATCH] Annotate tst_*() helpers with __attribute__ ((format (printf, M, N)))
>
> Signed-off-by: Geert Uytterhoeven <Geert.Uytterhoeven@sonycom.com>

Ok. Thanks.

Regards--
Subrata

> ---
> include/test.h | 18 ++++++++++++------
> 1 files changed, 12 insertions(+), 6 deletions(-)
>
> diff --git a/include/test.h b/include/test.h
> index 34ed5d2..03b0d46 100644
> --- a/include/test.h
> +++ b/include/test.h
> @@ -186,12 +186,18 @@
> * Functions from lib/tst_res.c
> */
> const char *strttype(int ttype);
> -void tst_res(int ttype, char *fname, char *arg_fmt, ...);
> -void tst_resm(int ttype, char *arg_fmt, ...);
> -void tst_brk(int ttype, char *fname, void (*func)(void), char *arg_fmt, ...);
> -void tst_brkloop(int ttype, char *fname, void (*func)(void), char *arg_fmt, ...);
> -void tst_brkm(int ttype, void (*func)(void), char *arg_fmt, ...);
> -void tst_brkloopm(int ttype, void (*func)(void), char *arg_fmt, ...);
> +void tst_res(int ttype, char *fname, char *arg_fmt, ...)
> + __attribute__ ((format (printf, 3, 4)));
> +void tst_resm(int ttype, char *arg_fmt, ...)
> + __attribute__ ((format (printf, 2, 3)));
> +void tst_brk(int ttype, char *fname, void (*func)(void), char *arg_fmt, ...)
> + __attribute__ ((format (printf, 4, 5)));
> +void tst_brkloop(int ttype, char *fname, void (*func)(void), char *arg_fmt, ...)
> + __attribute__ ((format (printf, 4, 5)));
> +void tst_brkm(int ttype, void (*func)(void), char *arg_fmt, ...)
> + __attribute__ ((format (printf, 3, 4)));
> +void tst_brkloopm(int ttype, void (*func)(void), char *arg_fmt, ...)
> + __attribute__ ((format (printf, 3, 4)));
> void tst_require_root(void (*func)(void));
> int tst_environ(void);
> void tst_exit(void) LTP_ATTRIBUTE_NORETURN;