Source-Changes-HG archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
[src/trunk]: src/usr.bin/xlint/lint1 lint: warn that bsearch effectively disc...
details: https://anonhg.NetBSD.org/src/rev/028dd85510e2
branches: trunk
changeset: 989009:028dd85510e2
user: rillig <rillig%NetBSD.org@localhost>
date: Sat Oct 09 20:03:20 2021 +0000
description:
lint: warn that bsearch effectively discards 'const'
Just like strchr, bsearch takes a const pointer and returns a non-const
pointer into the same object.
diffstat:
tests/usr.bin/xlint/lint1/msg_346.c | 8 +++---
tests/usr.bin/xlint/lint1/msg_346.exp | 1 +
usr.bin/xlint/lint1/tree.c | 39 +++++++++++++++++++++++++++++++---
3 files changed, 40 insertions(+), 8 deletions(-)
diffs (113 lines):
diff -r ec0ebfe281e1 -r 028dd85510e2 tests/usr.bin/xlint/lint1/msg_346.c
--- a/tests/usr.bin/xlint/lint1/msg_346.c Sat Oct 09 20:00:41 2021 +0000
+++ b/tests/usr.bin/xlint/lint1/msg_346.c Sat Oct 09 20:03:20 2021 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: msg_346.c,v 1.5 2021/10/09 19:18:52 rillig Exp $ */
+/* $NetBSD: msg_346.c,v 1.6 2021/10/09 20:03:20 rillig Exp $ */
# 3 "msg_346.c"
// Test for message: call to '%s' effectively discards 'const' from argument [346]
@@ -71,18 +71,18 @@
int cmp(const void *, const void *);
void take_void_ptr(void *);
-void take_const_void_ptr(void *);
+void take_const_void_ptr(const void *);
void
bsearch_example(void)
{
+ int arr[] = { 1 };
const int const_arr[] = { 1 };
- const int arr[] = { 1 };
take_const_void_ptr(bsearch("", const_arr, 4, 1, cmp));
take_const_void_ptr(bsearch("", arr, 4, 1, cmp));
take_void_ptr(bsearch("", arr, 4, 1, cmp));
- /* TODO: expect+1: warning: call to 'bsearch' effectively discards 'const' from argument [346] */
+ /* expect+1: warning: call to 'bsearch' effectively discards 'const' from argument [346] */
take_void_ptr(bsearch("", const_arr, 4, 1, cmp));
}
diff -r ec0ebfe281e1 -r 028dd85510e2 tests/usr.bin/xlint/lint1/msg_346.exp
--- a/tests/usr.bin/xlint/lint1/msg_346.exp Sat Oct 09 20:00:41 2021 +0000
+++ b/tests/usr.bin/xlint/lint1/msg_346.exp Sat Oct 09 20:03:20 2021 +0000
@@ -7,3 +7,4 @@
msg_346.c(50): warning: call to 'strrchr' effectively discards 'const' from argument [346]
msg_346.c(52): warning: call to 'strstr' effectively discards 'const' from argument [346]
msg_346.c(60): error: argument mismatch: 0 arg passed, 2 expected [150]
+msg_346.c(87): warning: call to 'bsearch' effectively discards 'const' from argument [346]
diff -r ec0ebfe281e1 -r 028dd85510e2 usr.bin/xlint/lint1/tree.c
--- a/usr.bin/xlint/lint1/tree.c Sat Oct 09 20:00:41 2021 +0000
+++ b/usr.bin/xlint/lint1/tree.c Sat Oct 09 20:03:20 2021 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: tree.c,v 1.383 2021/09/26 14:52:37 rillig Exp $ */
+/* $NetBSD: tree.c,v 1.384 2021/10/09 20:03:20 rillig Exp $ */
/*
* Copyright (c) 1994, 1995 Jochen Pohl
@@ -37,7 +37,7 @@
#include <sys/cdefs.h>
#if defined(__RCSID) && !defined(lint)
-__RCSID("$NetBSD: tree.c,v 1.383 2021/09/26 14:52:37 rillig Exp $");
+__RCSID("$NetBSD: tree.c,v 1.384 2021/10/09 20:03:20 rillig Exp $");
#endif
#include <float.h>
@@ -1412,7 +1412,16 @@
}
static bool
-is_first_arg_const(const tnode_t *tn)
+is_const_pointer(const tnode_t *tn)
+{
+ const type_t *tp;
+
+ tp = before_conversion(tn)->tn_type;
+ return tp->t_tspec == PTR && tp->t_subt->t_const;
+}
+
+static bool
+is_first_arg_const_char_pointer(const tnode_t *tn)
{
const tnode_t *an;
@@ -1425,6 +1434,20 @@
return is_const_char_pointer(an->tn_left);
}
+static bool
+is_second_arg_const_pointer(const tnode_t *tn)
+{
+ const tnode_t *an;
+
+ an = tn->tn_right;
+ if (an == NULL || an->tn_right == NULL)
+ return false;
+
+ while (an->tn_right->tn_right != NULL)
+ an = an->tn_right;
+ return is_const_pointer(an->tn_left);
+}
+
static void
check_unconst_function(const type_t *lstp, const tnode_t *rn)
{
@@ -1433,7 +1456,15 @@
if (lstp->t_tspec == CHAR && !lstp->t_const &&
is_direct_function_call(rn, &function_name) &&
is_unconst_function(function_name) &&
- is_first_arg_const(rn)) {
+ is_first_arg_const_char_pointer(rn)) {
+ /* call to '%s' effectively discards 'const' from argument */
+ warning(346, function_name);
+ }
+
+ if (!lstp->t_const &&
+ is_direct_function_call(rn, &function_name) &&
+ strcmp(function_name, "bsearch") == 0 &&
+ is_second_arg_const_pointer(rn)) {
/* call to '%s' effectively discards 'const' from argument */
warning(346, function_name);
}
Home |
Main Index |
Thread Index |
Old Index