[libvirt] [PATCH 06/10] maint: tighten strncmp syntax check

Eric Blake eblake at redhat.com
Thu Nov 18 04:28:58 UTC 2010


Using 'int ret = strcmp(a, b)' in a qsort function is a valid use of
str[n]cmp that should _not_ be turned to STREQ, but it was falling
foul of our specific syntax-check.  Meanwhile, gnulib's maint.mk
already has a tighter bound for strcmp, so we can copy that regex and
just check for strncmp, which results in fewer false positives that
require exceptions.

* cfg.mk (sc_prohibit_strcmp_and_strncmp): Rename...
(sc_prohibit_strncmp): ...to this, and tighten, to mirror
maint.mk's sc_prohibit_strcmp's better regex.
* Makefile.am (syntax_check_exceptions): Update exception rule.
* .x-sc_prohibit_strcmp_and_strncmp: Rename...
* .x-sc_prohibit_strncmp: ...and trim.
---
 .x-sc_prohibit_strcmp_and_strncmp |    9 ---------
 .x-sc_prohibit_strncmp            |    1 +
 Makefile.am                       |    2 +-
 cfg.mk                            |   14 ++++++++------
 4 files changed, 10 insertions(+), 16 deletions(-)
 delete mode 100644 .x-sc_prohibit_strcmp_and_strncmp
 create mode 100644 .x-sc_prohibit_strncmp

diff --git a/.x-sc_prohibit_strcmp_and_strncmp b/.x-sc_prohibit_strcmp_and_strncmp
deleted file mode 100644
index 77c3ee6..0000000
--- a/.x-sc_prohibit_strcmp_and_strncmp
+++ /dev/null
@@ -1,9 +0,0 @@
-^gnulib/
-^ChangeLog-old$
-^docs/
-^examples/domain-events/events-c/event-test\.c$
-^src/internal\.h$
-^src/lxc/lxc_container\.c$
-^src/node_device/node_device_devkit\.c$
-^src/node_device/node_device_hal\.c$
-^src/storage/parthelper\.c$
diff --git a/.x-sc_prohibit_strncmp b/.x-sc_prohibit_strncmp
new file mode 100644
index 0000000..8be2055
--- /dev/null
+++ b/.x-sc_prohibit_strncmp
@@ -0,0 +1 @@
+^src/internal\.h$
diff --git a/Makefile.am b/Makefile.am
index d34313a..efdc204 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -33,7 +33,7 @@ syntax_check_exceptions = \
   .x-sc_prohibit_readlink \
   .x-sc_prohibit_sprintf \
   .x-sc_prohibit_strcmp \
-  .x-sc_prohibit_strcmp_and_strncmp \
+  .x-sc_prohibit_strncmp \
   .x-sc_prohibit_strncpy \
   .x-sc_prohibit_test_minus_ao \
   .x-sc_prohibit_VIR_ERR_NO_MEMORY \
diff --git a/cfg.mk b/cfg.mk
index 19a4622..1863bf1 100644
--- a/cfg.mk
+++ b/cfg.mk
@@ -231,12 +231,14 @@ sc_avoid_write:
 	halt='consider using safewrite instead of write'		\
 	  $(_sc_search_regexp)

-# Use STREQ rather than comparing strcmp == 0, or != 0.
-# Similarly, use STREQLEN or STRPREFIX rather than strncmp.
-sc_prohibit_strcmp_and_strncmp:
-	@prohibit='strn?cmp *\('					\
-	halt='use STREQ() in place of the above uses of str[n]cmp'	\
-	  $(_sc_search_regexp)
+# Similar to the gnulib maint.mk rule for sc_prohibit_strcmp
+# Use STREQLEN or STRPREFIX rather than comparing strncmp == 0, or != 0.
+sc_prohibit_strncmp:
+	@grep -nE '! *str''ncmp *\(|\<str''ncmp *\([^)]+\) *=='		\
+	    $$($(VC_LIST_EXCEPT))					\
+	  | grep -vE ':# *define STREQ\(' &&				\
+	  { echo '$(ME): use STREQLEN or STRPREFIX instead of str''ncmp' \
+		1>&2; exit 1; } || :

 # Use virAsprintf rather than as'printf since *strp is undefined on error.
 sc_prohibit_asprintf:
-- 
1.7.3.2




More information about the libvir-list mailing list