Commit 82c4c3b7 authored by Alexei Starovoitov's avatar Alexei Starovoitov

Merge branch 'fix-printf'

Quentin Monnet says:

====================
Because the "__printf()" attributes were used only where the functions are
implemented, and not in header files, the checks have not been enforced on
all the calls to printf()-like functions, and a number of errors slipped in
bpftool over time.

This set cleans up such errors, and then moves the "__printf()" attributes
to header files, so that the checks are performed at all locations.
====================
Signed-off-by: default avatarAlexei Starovoitov <ast@kernel.org>
parents dadb81d0 8918dc42
...@@ -449,7 +449,7 @@ static int do_dump(int argc, char **argv) ...@@ -449,7 +449,7 @@ static int do_dump(int argc, char **argv)
btf_id = strtoul(*argv, &endptr, 0); btf_id = strtoul(*argv, &endptr, 0);
if (*endptr) { if (*endptr) {
p_err("can't parse %s as ID", **argv); p_err("can't parse %s as ID", *argv);
return -1; return -1;
} }
NEXT_ARG(); NEXT_ARG();
......
...@@ -26,9 +26,9 @@ static void btf_dumper_ptr(const void *data, json_writer_t *jw, ...@@ -26,9 +26,9 @@ static void btf_dumper_ptr(const void *data, json_writer_t *jw,
bool is_plain_text) bool is_plain_text)
{ {
if (is_plain_text) if (is_plain_text)
jsonw_printf(jw, "%p", *(unsigned long *)data); jsonw_printf(jw, "%p", data);
else else
jsonw_printf(jw, "%u", *(unsigned long *)data); jsonw_printf(jw, "%lu", *(unsigned long *)data);
} }
static int btf_dumper_modifier(const struct btf_dumper *d, __u32 type_id, static int btf_dumper_modifier(const struct btf_dumper *d, __u32 type_id,
...@@ -216,7 +216,7 @@ static int btf_dumper_int(const struct btf_type *t, __u8 bit_offset, ...@@ -216,7 +216,7 @@ static int btf_dumper_int(const struct btf_type *t, __u8 bit_offset,
switch (BTF_INT_ENCODING(*int_type)) { switch (BTF_INT_ENCODING(*int_type)) {
case 0: case 0:
if (BTF_INT_BITS(*int_type) == 64) if (BTF_INT_BITS(*int_type) == 64)
jsonw_printf(jw, "%lu", *(__u64 *)data); jsonw_printf(jw, "%llu", *(__u64 *)data);
else if (BTF_INT_BITS(*int_type) == 32) else if (BTF_INT_BITS(*int_type) == 32)
jsonw_printf(jw, "%u", *(__u32 *)data); jsonw_printf(jw, "%u", *(__u32 *)data);
else if (BTF_INT_BITS(*int_type) == 16) else if (BTF_INT_BITS(*int_type) == 16)
...@@ -229,7 +229,7 @@ static int btf_dumper_int(const struct btf_type *t, __u8 bit_offset, ...@@ -229,7 +229,7 @@ static int btf_dumper_int(const struct btf_type *t, __u8 bit_offset,
break; break;
case BTF_INT_SIGNED: case BTF_INT_SIGNED:
if (BTF_INT_BITS(*int_type) == 64) if (BTF_INT_BITS(*int_type) == 64)
jsonw_printf(jw, "%ld", *(long long *)data); jsonw_printf(jw, "%lld", *(long long *)data);
else if (BTF_INT_BITS(*int_type) == 32) else if (BTF_INT_BITS(*int_type) == 32)
jsonw_printf(jw, "%d", *(int *)data); jsonw_printf(jw, "%d", *(int *)data);
else if (BTF_INT_BITS(*int_type) == 16) else if (BTF_INT_BITS(*int_type) == 16)
......
...@@ -29,7 +29,7 @@ ...@@ -29,7 +29,7 @@
#define BPF_FS_MAGIC 0xcafe4a11 #define BPF_FS_MAGIC 0xcafe4a11
#endif #endif
void __printf(1, 2) p_err(const char *fmt, ...) void p_err(const char *fmt, ...)
{ {
va_list ap; va_list ap;
...@@ -47,7 +47,7 @@ void __printf(1, 2) p_err(const char *fmt, ...) ...@@ -47,7 +47,7 @@ void __printf(1, 2) p_err(const char *fmt, ...)
va_end(ap); va_end(ap);
} }
void __printf(1, 2) p_info(const char *fmt, ...) void p_info(const char *fmt, ...)
{ {
va_list ap; va_list ap;
......
...@@ -15,7 +15,6 @@ ...@@ -15,7 +15,6 @@
#include <malloc.h> #include <malloc.h>
#include <inttypes.h> #include <inttypes.h>
#include <stdint.h> #include <stdint.h>
#include <linux/compiler.h>
#include "json_writer.h" #include "json_writer.h"
...@@ -153,8 +152,7 @@ void jsonw_name(json_writer_t *self, const char *name) ...@@ -153,8 +152,7 @@ void jsonw_name(json_writer_t *self, const char *name)
putc(' ', self->out); putc(' ', self->out);
} }
void __printf(2, 0) void jsonw_vprintf_enquote(json_writer_t *self, const char *fmt, va_list ap)
jsonw_vprintf_enquote(json_writer_t *self, const char *fmt, va_list ap)
{ {
jsonw_eor(self); jsonw_eor(self);
putc('"', self->out); putc('"', self->out);
...@@ -162,7 +160,7 @@ jsonw_vprintf_enquote(json_writer_t *self, const char *fmt, va_list ap) ...@@ -162,7 +160,7 @@ jsonw_vprintf_enquote(json_writer_t *self, const char *fmt, va_list ap)
putc('"', self->out); putc('"', self->out);
} }
void __printf(2, 3) jsonw_printf(json_writer_t *self, const char *fmt, ...) void jsonw_printf(json_writer_t *self, const char *fmt, ...)
{ {
va_list ap; va_list ap;
......
...@@ -14,6 +14,7 @@ ...@@ -14,6 +14,7 @@
#include <stdbool.h> #include <stdbool.h>
#include <stdint.h> #include <stdint.h>
#include <stdarg.h> #include <stdarg.h>
#include <linux/compiler.h>
/* Opaque class structure */ /* Opaque class structure */
typedef struct json_writer json_writer_t; typedef struct json_writer json_writer_t;
...@@ -30,8 +31,9 @@ void jsonw_pretty(json_writer_t *self, bool on); ...@@ -30,8 +31,9 @@ void jsonw_pretty(json_writer_t *self, bool on);
void jsonw_name(json_writer_t *self, const char *name); void jsonw_name(json_writer_t *self, const char *name);
/* Add value */ /* Add value */
void jsonw_vprintf_enquote(json_writer_t *self, const char *fmt, va_list ap); void __printf(2, 0) jsonw_vprintf_enquote(json_writer_t *self, const char *fmt,
void jsonw_printf(json_writer_t *self, const char *fmt, ...); va_list ap);
void __printf(2, 3) jsonw_printf(json_writer_t *self, const char *fmt, ...);
void jsonw_string(json_writer_t *self, const char *value); void jsonw_string(json_writer_t *self, const char *value);
void jsonw_bool(json_writer_t *self, bool value); void jsonw_bool(json_writer_t *self, bool value);
void jsonw_float(json_writer_t *self, double number); void jsonw_float(json_writer_t *self, double number);
......
...@@ -139,7 +139,7 @@ int detect_common_prefix(const char *arg, ...) ...@@ -139,7 +139,7 @@ int detect_common_prefix(const char *arg, ...)
strncat(msg, "'", sizeof(msg) - strlen(msg) - 1); strncat(msg, "'", sizeof(msg) - strlen(msg) - 1);
if (count >= 2) { if (count >= 2) {
p_err(msg); p_err("%s", msg);
return -1; return -1;
} }
......
...@@ -98,8 +98,8 @@ extern int bpf_flags; ...@@ -98,8 +98,8 @@ extern int bpf_flags;
extern struct pinned_obj_table prog_table; extern struct pinned_obj_table prog_table;
extern struct pinned_obj_table map_table; extern struct pinned_obj_table map_table;
void p_err(const char *fmt, ...); void __printf(1, 2) p_err(const char *fmt, ...);
void p_info(const char *fmt, ...); void __printf(1, 2) p_info(const char *fmt, ...);
bool is_prefix(const char *pfx, const char *str); bool is_prefix(const char *pfx, const char *str);
int detect_common_prefix(const char *arg, ...); int detect_common_prefix(const char *arg, ...);
......
...@@ -157,7 +157,7 @@ int do_event_pipe(int argc, char **argv) ...@@ -157,7 +157,7 @@ int do_event_pipe(int argc, char **argv)
NEXT_ARG(); NEXT_ARG();
ctx.cpu = strtoul(*argv, &endptr, 0); ctx.cpu = strtoul(*argv, &endptr, 0);
if (*endptr) { if (*endptr) {
p_err("can't parse %s as CPU ID", **argv); p_err("can't parse %s as CPU ID", *argv);
goto err_close_map; goto err_close_map;
} }
...@@ -168,7 +168,7 @@ int do_event_pipe(int argc, char **argv) ...@@ -168,7 +168,7 @@ int do_event_pipe(int argc, char **argv)
NEXT_ARG(); NEXT_ARG();
ctx.idx = strtoul(*argv, &endptr, 0); ctx.idx = strtoul(*argv, &endptr, 0);
if (*endptr) { if (*endptr) {
p_err("can't parse %s as index", **argv); p_err("can't parse %s as index", *argv);
goto err_close_map; goto err_close_map;
} }
......
...@@ -226,7 +226,7 @@ static int query_flow_dissector(struct bpf_attach_info *attach_info) ...@@ -226,7 +226,7 @@ static int query_flow_dissector(struct bpf_attach_info *attach_info)
fd = open("/proc/self/ns/net", O_RDONLY); fd = open("/proc/self/ns/net", O_RDONLY);
if (fd < 0) { if (fd < 0) {
p_err("can't open /proc/self/ns/net: %d", p_err("can't open /proc/self/ns/net: %s",
strerror(errno)); strerror(errno));
return -1; return -1;
} }
......
...@@ -6,9 +6,11 @@ ...@@ -6,9 +6,11 @@
/* /*
* Common definitions for all gcc versions go here. * Common definitions for all gcc versions go here.
*/ */
#ifndef GCC_VERSION
#define GCC_VERSION (__GNUC__ * 10000 \ #define GCC_VERSION (__GNUC__ * 10000 \
+ __GNUC_MINOR__ * 100 \ + __GNUC_MINOR__ * 100 \
+ __GNUC_PATCHLEVEL__) + __GNUC_PATCHLEVEL__)
#endif
#if GCC_VERSION >= 70000 && !defined(__CHECKER__) #if GCC_VERSION >= 70000 && !defined(__CHECKER__)
# define __fallthrough __attribute__ ((fallthrough)) # define __fallthrough __attribute__ ((fallthrough))
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment