[pacman-dev] [PATCH] Add format attributes to all required functions
Fixes all clang warnings with -Wformat-literal. Also, fix genuine formating issue discovered once adding these attributes and add a cast to prevent a gcc warning. Signed-off-by: Allan McRae <allan@archlinux.org> --- lib/libalpm/alpm.h | 3 ++- lib/libalpm/log.c | 4 ++-- lib/libalpm/trans.c | 4 ++-- lib/libalpm/util.h | 5 ++++- src/pacman/callback.h | 1 + src/pacman/util.c | 3 ++- src/pacman/util.h | 6 +++--- src/util/cleanupdelta.c | 1 + src/util/testdb.c | 1 + src/util/testpkg.c | 1 + 10 files changed, 19 insertions(+), 10 deletions(-) diff --git a/lib/libalpm/alpm.h b/lib/libalpm/alpm.h index 729a4c8..14443bb 100644 --- a/lib/libalpm/alpm.h +++ b/lib/libalpm/alpm.h @@ -271,8 +271,9 @@ typedef enum _alpm_loglevel_t { } alpm_loglevel_t; typedef void (*alpm_cb_log)(alpm_loglevel_t, const char *, va_list); + int alpm_logaction(alpm_handle_t *handle, const char *prefix, - const char *fmt, ...); + const char *fmt, ...) __attribute__((format(printf, 3, 4))); /** * Events. diff --git a/lib/libalpm/log.c b/lib/libalpm/log.c index a8639b4..271bd00 100644 --- a/lib/libalpm/log.c +++ b/lib/libalpm/log.c @@ -39,8 +39,8 @@ * @param fmt output format * @return 0 on success, -1 on error (pm_errno is set accordingly) */ -int SYMEXPORT alpm_logaction(alpm_handle_t *handle, const char *prefix, const - char *fmt, ...) +int SYMEXPORT alpm_logaction(alpm_handle_t *handle, const char *prefix, + const char *fmt, ...) { int ret; va_list args; diff --git a/lib/libalpm/trans.c b/lib/libalpm/trans.c index b0488eb..8d4e0e7 100644 --- a/lib/libalpm/trans.c +++ b/lib/libalpm/trans.c @@ -218,8 +218,8 @@ int SYMEXPORT alpm_trans_release(alpm_handle_t *handle) if(_alpm_handle_unlock(handle)) { _alpm_log(handle, ALPM_LOG_WARNING, _("could not remove lock file %s\n"), handle->lockfile); - alpm_logaction(handle, "warning: could not remove lock file %s\n", - handle->lockfile); + alpm_logaction(handle, ALPM_CALLER_PREFIX, + "warning: could not remove lock file %s\n", handle->lockfile); } } diff --git a/lib/libalpm/util.h b/lib/libalpm/util.h index 93b6573..56031f3 100644 --- a/lib/libalpm/util.h +++ b/lib/libalpm/util.h @@ -120,7 +120,10 @@ int _alpm_unpack(alpm_handle_t *handle, const char *archive, const char *prefix, alpm_list_t *list, int breakfirst); ssize_t _alpm_files_in_directory(alpm_handle_t *handle, const char *path, int full_count); -int _alpm_logaction(alpm_handle_t *handle, const char *prefix, const char *fmt, va_list args); + +int _alpm_logaction(alpm_handle_t *handle, const char *prefix, const char *fmt, va_list args) + __attribute__((format(printf, 3, 0))); + int _alpm_run_chroot(alpm_handle_t *handle, const char *cmd, char *const argv[]); int _alpm_ldconfig(alpm_handle_t *handle); int _alpm_str_cmp(const void *s1, const void *s2); diff --git a/src/pacman/callback.h b/src/pacman/callback.h index 4717360..a291fc7 100644 --- a/src/pacman/callback.h +++ b/src/pacman/callback.h @@ -41,6 +41,7 @@ void cb_dl_total(off_t total); void cb_dl_progress(const char *filename, off_t file_xfered, off_t file_total); /* callback to handle messages/notifications from pacman library */ +__attribute__((format(printf, 2, 0))) void cb_log(alpm_loglevel_t level, const char *fmt, va_list args); #endif /* _PM_CALLBACK_H */ diff --git a/src/pacman/util.c b/src/pacman/util.c index 03063fb..6afd701 100644 --- a/src/pacman/util.c +++ b/src/pacman/util.c @@ -992,7 +992,7 @@ static char *pkg_get_location(alpm_pkg_t *pkg) case PM_OP_SYNC: servers = alpm_db_get_servers(alpm_pkg_get_db(pkg)); if(servers) { - pm_asprintf(&string, "%s/%s", servers->data, + pm_asprintf(&string, "%s/%s", (char *)(servers->data), alpm_pkg_get_filename(pkg)); return string; } @@ -1443,6 +1443,7 @@ int select_question(int count) /* presents a prompt and gets a Y/N answer */ +__attribute__((format(printf, 2, 0))) static int question(short preset, char *fmt, va_list args) { char response[32]; diff --git a/src/pacman/util.h b/src/pacman/util.h index c38291a..2d1e698 100644 --- a/src/pacman/util.h +++ b/src/pacman/util.h @@ -72,11 +72,11 @@ void print_packages(const alpm_list_t *packages); void select_display(const alpm_list_t *pkglist); int select_question(int count); int multiselect_question(char *array, int count); -int yesno(char *fmt, ...); -int noyes(char *fmt, ...); +int yesno(char *fmt, ...) __attribute__((format(printf, 1, 2))); +int noyes(char *fmt, ...) __attribute__((format(printf, 1, 2))); int pm_printf(alpm_loglevel_t level, const char *format, ...) __attribute__((format(printf,2,3))); -int pm_asprintf(char **string, const char *format, ...); +int pm_asprintf(char **string, const char *format, ...) __attribute__((format(printf,2,3))); int pm_vfprintf(FILE *stream, alpm_loglevel_t level, const char *format, va_list args) __attribute__((format(printf,3,0))); int pm_vasprintf(char **string, alpm_loglevel_t level, const char *format, va_list args) __attribute__((format(printf,3,0))); diff --git a/src/util/cleanupdelta.c b/src/util/cleanupdelta.c index 144e038..4f34435 100644 --- a/src/util/cleanupdelta.c +++ b/src/util/cleanupdelta.c @@ -37,6 +37,7 @@ static void cleanup(int signum) exit(signum); } +__attribute__((format(printf, 2, 0))) static void output_cb(alpm_loglevel_t level, const char *fmt, va_list args) { if(strlen(fmt)) { diff --git a/src/util/testdb.c b/src/util/testdb.c index 2017b60..7b08cb0 100644 --- a/src/util/testdb.c +++ b/src/util/testdb.c @@ -40,6 +40,7 @@ static void cleanup(int signum) exit(signum); } +__attribute__((format(printf, 2, 0))) static void output_cb(alpm_loglevel_t level, const char *fmt, va_list args) { if(strlen(fmt)) { diff --git a/src/util/testpkg.c b/src/util/testpkg.c index 96400a7..10b2f2c 100644 --- a/src/util/testpkg.c +++ b/src/util/testpkg.c @@ -24,6 +24,7 @@ #define BASENAME "testpkg" +__attribute__((format(printf, 2, 0))) static void output_cb(alpm_loglevel_t level, const char *fmt, va_list args) { if(fmt[0] == '\0') { -- 1.8.1.3
On Sun, 10 Feb 2013 16:51:52 +1000 Allan McRae <allan@archlinux.org> wrote:
Fixes all clang warnings with -Wformat-literal.
Also, fix genuine formating issue discovered once adding these attributes and add a cast to prevent a gcc warning.
Signed-off-by: Allan McRae <allan@archlinux.org> ---
Much better than all those pragmas! I still get one error though: util.c:874:41: error: format specifies type 'int' but the argument has type 'size_t' (aka 'unsigned long') [-Werror,-Wformat] pm_asprintf(&str, _("Packages (%d):"), alpm_list_count(targets)); ~~ ^~~~~~~~~~~~~~~~~~~~~~~~ I believe that should be %zd
On 10/02/13 23:53, Andrew Gregory wrote:
On Sun, 10 Feb 2013 16:51:52 +1000 Allan McRae <allan@archlinux.org> wrote:
Fixes all clang warnings with -Wformat-literal.
Also, fix genuine formating issue discovered once adding these attributes and add a cast to prevent a gcc warning.
Signed-off-by: Allan McRae <allan@archlinux.org> ---
Much better than all those pragmas! I still get one error though:
util.c:874:41: error: format specifies type 'int' but the argument has type 'size_t' (aka 'unsigned long') [-Werror,-Wformat] pm_asprintf(&str, _("Packages (%d):"), alpm_list_count(targets)); ~~ ^~~~~~~~~~~~~~~~~~~~~~~~
I believe that should be %zd
Yes - I don't see these on i686. Added to the patch on my working branch. Allan
participants (2)
-
Allan McRae
-
Andrew Gregory