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