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: Alexei Starovoitov <ast@kernel.org>
This commit is contained in:
commit
82c4c3b7c7
@ -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,
|
|||||||
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,
|
|||||||
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,
|
|||||||
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 @@
|
|||||||
#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, ...)
|
|||||||
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 @@
|
|||||||
#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)
|
|||||||
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)
|
|||||||
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 @@
|
|||||||
#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);
|
|||||||
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, ...)
|
|||||||
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;
|
|||||||
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)
|
|||||||
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)
|
|||||||
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)
|
|||||||
|
|
||||||
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 @@
|
|||||||
/*
|
/*
|
||||||
* 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))
|
||||||
|
Loading…
x
Reference in New Issue
Block a user