seq_file: fix NULL pointer arithmetic warning
PATCH 1/1 seq_file: fix NULL pointer arithmetic warning
Implement conditional logic in order to replace NULL pointer arithmetic.
The use of NULL pointer arithmetic was pointed out by clang with the following warning:
fs/kernfs/file.c:128:15: warning: performing pointer arithmetic on a null pointer has undefined behavior [-Wnull-pointer-arithmetic]
return NULL + !*ppos;
~~~~ ^
fs/seq_file.c:559:14: warning: performing pointer arithmetic on a
null pointer has undefined behavior [-Wnull-pointer-arithmetic]
return NULL + (*pos == 0);--- fs/kernfs/file.c | 6 ++++-- fs/seq_file.c | 2 +- 2 files changed, 5 insertions(+), 3 deletions(-)
fs/kernfs/file.c +4 -2
@@ -120,12 +120,14 @@ static void *kernfs_seq_start(struct seq_file *sf, loff_t *ppos)if (next ==ERR_PTR (-ENODEV ))kernfs_seq_stop_active (sf, next);return next; - }else { + }else if (*ppos) {/* * The same behavior and code as single_open(). Returns * !NULL if pos is at the beginning; otherwise, NULL. */ -return NULL + !*ppos; +return NULL ; + }else { +return (void *)1 ; } }
fs/seq_file.c +1 -1
@@ -556,7 +556,7 @@ EXPORT_SYMBOL(seq_dentry);static void *single_start (struct seq_file *p,loff_t *pos) { -return NULL + (*pos ==0 ); +return *pos ?NULL : (void *)1 ; }static void *single_next (struct seq_file *p,void *v,loff_t *pos)
Signature · 1 line
2.34.1
Al Viro
maintainerQuoted 5 lines · Maíra Canal
Implement conditional logic in order to replace NULL pointer arithmetic.
The use of NULL pointer arithmetic was pointed out by clang with the following warning:
Quoted 7 lines
fs/kernfs/file.c:128:15: warning: performing pointer arithmetic on a null pointer has undefined behavior [-Wnull-pointer-arithmetic]return NULL + !*ppos; ~~~~ ^ fs/seq_file.c:559:14: warning: performing pointer arithmetic on a null pointer has undefined behavior [-Wnull-pointer-arithmetic] return NULL + (*pos == 0);
NAK. _If_ you want to bother with that at all, at least make it use SEQ_START_TOKEN, rather than open-coding it; what's more, kernfs_seq_start() should simply call single_start() instead of open-coding it. I.e.
if (ops->seq_start) {
void *next = ops->seq_start(sf, ppos);
/* see the comment above kernfs_seq_stop_active() */
if (next == ERR_PTR(-ENODEV))
kernfs_seq_stop_active(sf, next);
return next;
} else {
return single_start(sf, ppos);
}
and
return *ppos ? NULL : SEQ_START_TOKEN;in single_start() itself.