2019-10-02 16:51:19 +00:00
|
|
|
#
|
|
|
|
# Rules for running syntax-check, derived from gnulib's
|
|
|
|
# maint.mk
|
|
|
|
#
|
2019-01-03 15:31:37 +00:00
|
|
|
# Copyright (C) 2008-2019 Red Hat, Inc.
|
2019-10-02 16:51:19 +00:00
|
|
|
# Copyright (C) 2003-2019 Free Software Foundation, Inc.
|
2008-01-29 17:42:39 +00:00
|
|
|
|
|
|
|
# This program is free software: you can redistribute it and/or modify
|
|
|
|
# it under the terms of the GNU General Public License as published by
|
|
|
|
# the Free Software Foundation, either version 3 of the License, or
|
|
|
|
# (at your option) any later version.
|
|
|
|
|
|
|
|
# This program is distributed in the hope that it will be useful,
|
|
|
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
# GNU General Public License for more details.
|
|
|
|
|
|
|
|
# You should have received a copy of the GNU General Public License
|
2012-07-26 22:58:02 +00:00
|
|
|
# along with this program. If not, see
|
|
|
|
# <http://www.gnu.org/licenses/>.
|
2008-01-29 17:42:39 +00:00
|
|
|
|
2019-10-02 16:51:19 +00:00
|
|
|
# This is reported not to work with make-3.79.1
|
|
|
|
# ME := $(word $(words $(MAKEFILE_LIST)),$(MAKEFILE_LIST))
|
|
|
|
ME := $(_build-aux)/syntax-check.mk
|
|
|
|
|
|
|
|
# These variables ought to be defined through the configure.ac section
|
|
|
|
# of the module description. But some packages import this file directly,
|
|
|
|
# ignoring the module description.
|
|
|
|
AWK ?= awk
|
|
|
|
GREP ?= grep
|
|
|
|
SED ?= sed
|
|
|
|
|
|
|
|
# Helper variables.
|
|
|
|
_empty =
|
|
|
|
_sp = $(_empty) $(_empty)
|
|
|
|
|
|
|
|
# _equal,S1,S2
|
|
|
|
# ------------
|
|
|
|
# If S1 == S2, return S1, otherwise the empty string.
|
|
|
|
_equal = $(and $(findstring $(1),$(2)),$(findstring $(2),$(1)))
|
|
|
|
|
|
|
|
GIT = git
|
|
|
|
VC = $(GIT)
|
|
|
|
|
|
|
|
VC_LIST = $(srcdir)/$(_build-aux)/vc-list-files -C $(srcdir)
|
|
|
|
|
|
|
|
# You can override this variable in syntax-check.mk if your gnulib submodule lives
|
|
|
|
# in a different location.
|
|
|
|
gnulib_dir ?= $(srcdir)/gnulib
|
|
|
|
|
|
|
|
# You can override this variable in syntax-check.mk to set your own regexp
|
|
|
|
# matching files to ignore.
|
|
|
|
VC_LIST_ALWAYS_EXCLUDE_REGEX ?= ^$$
|
|
|
|
|
|
|
|
# This is to preprocess robustly the output of $(VC_LIST), so that even
|
|
|
|
# when $(srcdir) is a pathological name like "....", the leading sed command
|
|
|
|
# removes only the intended prefix.
|
|
|
|
_dot_escaped_srcdir = $(subst .,\.,$(srcdir))
|
2019-11-08 14:25:33 +00:00
|
|
|
_dot_escaped_builddir = $(subst .,\.,$(builddir))
|
2019-10-02 16:51:19 +00:00
|
|
|
|
|
|
|
# Post-process $(VC_LIST) output, prepending $(srcdir)/, but only
|
|
|
|
# when $(srcdir) is not ".".
|
|
|
|
ifeq ($(srcdir),.)
|
|
|
|
_prepend_srcdir_prefix =
|
|
|
|
else
|
|
|
|
_prepend_srcdir_prefix = | $(SED) 's|^|$(srcdir)/|'
|
|
|
|
endif
|
|
|
|
|
|
|
|
# In order to be able to consistently filter "."-relative names,
|
|
|
|
# (i.e., with no $(srcdir) prefix), this definition is careful to
|
|
|
|
# remove any $(srcdir) prefix, and to restore what it removes.
|
|
|
|
_sc_excl = \
|
|
|
|
$(or $(exclude_file_name_regexp--$@),^$$)
|
|
|
|
VC_LIST_EXCEPT = \
|
|
|
|
$(VC_LIST) | $(SED) 's|^$(_dot_escaped_srcdir)/||' \
|
|
|
|
| if test -f $(srcdir)/.x-$@; then $(GREP) -vEf $(srcdir)/.x-$@; \
|
|
|
|
else $(GREP) -Ev -e "$${VC_LIST_EXCEPT_DEFAULT-ChangeLog}"; fi \
|
|
|
|
| $(GREP) -Ev -e '($(VC_LIST_ALWAYS_EXCLUDE_REGEX)|$(_sc_excl))' \
|
|
|
|
$(_prepend_srcdir_prefix)
|
|
|
|
|
|
|
|
# Override this in syntax-check.mk if you are using a different format in your
|
|
|
|
# NEWS file.
|
|
|
|
today = $(shell date +%Y-%m-%d)
|
|
|
|
|
|
|
|
# Prevent programs like 'sort' from considering distinct strings to be equal.
|
|
|
|
# Doing it here saves us from having to set LC_ALL elsewhere in this file.
|
|
|
|
export LC_ALL = C
|
|
|
|
|
|
|
|
## --------------- ##
|
|
|
|
## Sanity checks. ##
|
|
|
|
## --------------- ##
|
|
|
|
|
|
|
|
_cfg_mk := $(wildcard $(srcdir)/$(_build-aux)/syntax-check.mk)
|
|
|
|
|
|
|
|
# Collect the names of rules starting with 'sc_'.
|
|
|
|
syntax-check-rules := $(sort $(shell $(SED) -n \
|
|
|
|
's/^\(sc_[a-zA-Z0-9_-]*\):.*/\1/p' $(srcdir)/$(ME) $(_cfg_mk)))
|
|
|
|
.PHONY: $(syntax-check-rules)
|
|
|
|
|
|
|
|
ifeq ($(shell $(VC_LIST) >/dev/null 2>&1; echo $$?),0)
|
|
|
|
local-checks-available += $(syntax-check-rules)
|
|
|
|
else
|
|
|
|
local-checks-available += no-vc-detected
|
|
|
|
no-vc-detected:
|
|
|
|
@echo "No version control files detected; skipping syntax check"
|
|
|
|
endif
|
|
|
|
.PHONY: $(local-checks-available)
|
|
|
|
|
|
|
|
# Arrange to print the name of each syntax-checking rule just before running it.
|
|
|
|
$(syntax-check-rules): %: %.m
|
|
|
|
sc_m_rules_ = $(patsubst %, %.m, $(syntax-check-rules))
|
|
|
|
.PHONY: $(sc_m_rules_)
|
|
|
|
$(sc_m_rules_):
|
|
|
|
@echo $(patsubst sc_%.m, %, $@)
|
|
|
|
@date +%s.%N > .sc-start-$(basename $@)
|
|
|
|
|
|
|
|
# Compute and print the elapsed time for each syntax-check rule.
|
|
|
|
sc_z_rules_ = $(patsubst %, %.z, $(syntax-check-rules))
|
|
|
|
.PHONY: $(sc_z_rules_)
|
|
|
|
$(sc_z_rules_): %.z: %
|
|
|
|
@end=$$(date +%s.%N); \
|
|
|
|
start=$$(cat .sc-start-$*); \
|
|
|
|
rm -f .sc-start-$*; \
|
|
|
|
$(AWK) -v s=$$start -v e=$$end \
|
|
|
|
'END {printf "%.2f $(patsubst sc_%,%,$*)\n", e - s}' < /dev/null
|
|
|
|
|
|
|
|
# The patsubst here is to replace each sc_% rule with its sc_%.z wrapper
|
|
|
|
# that computes and prints elapsed time.
|
|
|
|
local-check := \
|
|
|
|
$(patsubst sc_%, sc_%.z, \
|
|
|
|
$(filter-out $(local-checks-to-skip), $(local-checks-available)))
|
|
|
|
|
|
|
|
syntax-check: $(local-check)
|
|
|
|
|
2011-11-29 23:42:23 +00:00
|
|
|
# We haven't converted all scripts to using gnulib's init.sh yet.
|
|
|
|
_test_script_regex = \<\(init\|test-lib\)\.sh\>
|
|
|
|
|
2012-07-10 15:37:07 +00:00
|
|
|
# Most developers don't run 'make distcheck'. We want the official
|
|
|
|
# dist to be secure, but don't want to penalize other developers
|
|
|
|
# using a distro that has not yet picked up the automake fix.
|
|
|
|
# FIXME remove this ifeq (making the syntax check unconditional)
|
|
|
|
# once fixed automake (1.11.6 or 1.12.2+) is more common.
|
|
|
|
ifeq ($(filter dist%, $(MAKECMDGOALS)), )
|
|
|
|
local-checks-to-skip += sc_vulnerable_makefile_CVE-2012-3386
|
|
|
|
else
|
2012-08-16 22:18:44 +00:00
|
|
|
distdir: sc_vulnerable_makefile_CVE-2012-3386.z
|
2012-07-10 15:37:07 +00:00
|
|
|
endif
|
|
|
|
|
2010-11-30 20:29:19 +00:00
|
|
|
# Files that should never cause syntax check failures.
|
2011-07-08 15:13:53 +00:00
|
|
|
VC_LIST_ALWAYS_EXCLUDE_REGEX = \
|
2017-06-26 06:45:44 +00:00
|
|
|
(^(docs/(news(-[0-9]*)?\.html\.in|.*\.patch))|\.(po|fig|gif|ico|png))$$
|
2010-11-30 20:29:19 +00:00
|
|
|
|
|
|
|
# Functions like free() that are no-ops on NULL arguments.
|
2017-11-03 12:09:47 +00:00
|
|
|
useless_free_options = \
|
|
|
|
--name=VBOX_UTF16_FREE \
|
|
|
|
--name=VBOX_UTF8_FREE \
|
|
|
|
--name=VBOX_COM_UNALLOC_MEM \
|
|
|
|
--name=VIR_FREE \
|
|
|
|
--name=qemuCapsFree \
|
|
|
|
--name=qemuMigrationCookieFree \
|
|
|
|
--name=qemuMigrationCookieGraphicsFree \
|
|
|
|
--name=sexpr_free \
|
|
|
|
--name=usbFreeDevice \
|
|
|
|
--name=virBandwidthDefFree \
|
|
|
|
--name=virBitmapFree \
|
|
|
|
--name=virCPUDefFree \
|
|
|
|
--name=virCapabilitiesFree \
|
|
|
|
--name=virCapabilitiesFreeGuest \
|
|
|
|
--name=virCapabilitiesFreeGuestDomain \
|
|
|
|
--name=virCapabilitiesFreeGuestFeature \
|
|
|
|
--name=virCapabilitiesFreeGuestMachine \
|
|
|
|
--name=virCapabilitiesFreeHostNUMACell \
|
|
|
|
--name=virCapabilitiesFreeMachines \
|
|
|
|
--name=virCgroupFree \
|
|
|
|
--name=virCommandFree \
|
|
|
|
--name=virConfFreeList \
|
|
|
|
--name=virConfFreeValue \
|
|
|
|
--name=virDomainActualNetDefFree \
|
|
|
|
--name=virDomainChrDefFree \
|
|
|
|
--name=virDomainControllerDefFree \
|
|
|
|
--name=virDomainDefFree \
|
|
|
|
--name=virDomainDeviceDefFree \
|
|
|
|
--name=virDomainDiskDefFree \
|
|
|
|
--name=virDomainEventCallbackListFree \
|
|
|
|
--name=virObjectEventQueueFree \
|
|
|
|
--name=virDomainFSDefFree \
|
|
|
|
--name=virDomainGraphicsDefFree \
|
|
|
|
--name=virDomainHostdevDefFree \
|
|
|
|
--name=virDomainInputDefFree \
|
|
|
|
--name=virDomainNetDefFree \
|
|
|
|
--name=virDomainObjFree \
|
|
|
|
--name=virDomainSmartcardDefFree \
|
|
|
|
--name=virDomainSnapshotObjFree \
|
|
|
|
--name=virDomainSoundDefFree \
|
|
|
|
--name=virDomainVideoDefFree \
|
|
|
|
--name=virDomainWatchdogDefFree \
|
|
|
|
--name=virFileDirectFdFree \
|
|
|
|
--name=virHashFree \
|
|
|
|
--name=virInterfaceDefFree \
|
|
|
|
--name=virInterfaceIpDefFree \
|
|
|
|
--name=virInterfaceObjFree \
|
|
|
|
--name=virInterfaceProtocolDefFree \
|
|
|
|
--name=virJSONValueFree \
|
|
|
|
--name=virLastErrFreeData \
|
|
|
|
--name=virNetMessageFree \
|
|
|
|
--name=virNWFilterDefFree \
|
|
|
|
--name=virNWFilterEntryFree \
|
|
|
|
--name=virNWFilterHashTableFree \
|
|
|
|
--name=virNWFilterIPAddrLearnReqFree \
|
|
|
|
--name=virNWFilterIncludeDefFree \
|
|
|
|
--name=virNWFilterObjFree \
|
|
|
|
--name=virNWFilterRuleDefFree \
|
|
|
|
--name=virNWFilterRuleInstFree \
|
|
|
|
--name=virNetworkDefFree \
|
|
|
|
--name=virNodeDeviceDefFree \
|
|
|
|
--name=virNodeDeviceObjFree \
|
|
|
|
--name=virObjectUnref \
|
|
|
|
--name=virObjectFreeCallback \
|
|
|
|
--name=virPCIDeviceFree \
|
|
|
|
--name=virSecretDefFree \
|
|
|
|
--name=virStorageEncryptionFree \
|
|
|
|
--name=virStorageEncryptionSecretFree \
|
|
|
|
--name=virStorageFileFreeMetadata \
|
|
|
|
--name=virStoragePoolDefFree \
|
|
|
|
--name=virStoragePoolObjFree \
|
|
|
|
--name=virStoragePoolSourceFree \
|
|
|
|
--name=virStorageVolDefFree \
|
|
|
|
--name=virThreadPoolFree \
|
|
|
|
--name=xmlBufferFree \
|
|
|
|
--name=xmlFree \
|
|
|
|
--name=xmlFreeDoc \
|
|
|
|
--name=xmlFreeNode \
|
|
|
|
--name=xmlXPathFreeContext \
|
2008-02-07 16:49:29 +00:00
|
|
|
--name=xmlXPathFreeObject
|
Prepare to use maint.mk from gnulib
Since Makefile.maint will soon come from gnulib's maint.mk,
sync Makefile.maint to have the same contents (modulo minor
things). In syncing it, we have to remove some libvirt-specific
rules. Since we want to keep them (of course), put those in cfg.mk.
* Makefile.maint: Merge from gnulib's maint.mk.
* cfg.mk (sc_avoid_write): New rule. From Makefile.cfg.
(sc_prohibit_strcmp_and_strncmp): Likewise, and rename.
(sc_prohibit_asprintf, sc_prohibit_VIR_ERR_NO_MEMORY): Likewise.
(sc_prohibit_nonreentrant): Likewise.
(sc_prohibit_ctype_h): Likewise.
(sc_TAB_in_indentation, sc_avoid_ctype_macros): Likewise.
(sc_prohibit_virBufferAdd_with_string_literal): Likewise.
(sc_prohibit_gethostby): Likewise.
(sc_libvirt_unmarked_diagnostics): Likewise. Also, rename the
rule, inserting "_libvirt", since this rule is a specialization of
the one in gnulib.
* GNUmakefile: Include cfg.mk, not Makefile.cfg
* .x-sc_prohibit_strcmp_and_strncmp: New file.
* Makefile.am (EXTRA_DIST): Add .x-sc_prohibit_strcmp_and_strncmp
2009-07-06 16:28:10 +00:00
|
|
|
|
2010-05-17 20:38:59 +00:00
|
|
|
# The following template was generated by this command:
|
|
|
|
# make ID && aid free|grep '^vi'|sed 's/ .*//;s/^/# /'
|
|
|
|
# N virBufferFreeAndReset
|
|
|
|
# y virCPUDefFree
|
|
|
|
# y virCapabilitiesFree
|
|
|
|
# y virCapabilitiesFreeGuest
|
|
|
|
# y virCapabilitiesFreeGuestDomain
|
|
|
|
# y virCapabilitiesFreeGuestFeature
|
|
|
|
# y virCapabilitiesFreeGuestMachine
|
|
|
|
# y virCapabilitiesFreeHostNUMACell
|
|
|
|
# y virCapabilitiesFreeMachines
|
|
|
|
# N virCapabilitiesFreeNUMAInfo FIXME
|
|
|
|
# y virCgroupFree
|
|
|
|
# N virConfFree (diagnoses the "error")
|
|
|
|
# y virConfFreeList
|
|
|
|
# y virConfFreeValue
|
|
|
|
# y virDomainChrDefFree
|
|
|
|
# y virDomainControllerDefFree
|
|
|
|
# y virDomainDefFree
|
|
|
|
# y virDomainDeviceDefFree
|
|
|
|
# y virDomainDiskDefFree
|
|
|
|
# y virDomainEventCallbackListFree
|
|
|
|
# y virDomainEventQueueFree
|
|
|
|
# y virDomainFSDefFree
|
|
|
|
# n virDomainFree
|
|
|
|
# n virDomainFreeName (can't fix -- returns int)
|
|
|
|
# y virDomainGraphicsDefFree
|
|
|
|
# y virDomainHostdevDefFree
|
|
|
|
# y virDomainInputDefFree
|
|
|
|
# y virDomainNetDefFree
|
|
|
|
# y virDomainObjFree
|
|
|
|
# n virDomainSnapshotFree (returns int)
|
|
|
|
# n virDomainSnapshotFreeName (returns int)
|
|
|
|
# y virDomainSnapshotObjFree
|
|
|
|
# y virDomainSoundDefFree
|
|
|
|
# y virDomainVideoDefFree
|
|
|
|
# y virDomainWatchdogDefFree
|
|
|
|
# n virDrvNodeGetCellsFreeMemory (returns int)
|
|
|
|
# n virDrvNodeGetFreeMemory (returns long long)
|
2011-09-20 18:11:32 +00:00
|
|
|
# n virFree - dereferences param
|
2010-05-17 20:38:59 +00:00
|
|
|
# n virFreeError
|
|
|
|
# n virHashFree (takes 2 args)
|
|
|
|
# y virInterfaceDefFree
|
|
|
|
# n virInterfaceFree (returns int)
|
|
|
|
# n virInterfaceFreeName
|
|
|
|
# y virInterfaceIpDefFree
|
|
|
|
# y virInterfaceObjFree
|
|
|
|
# n virInterfaceObjListFree
|
|
|
|
# y virInterfaceProtocolDefFree
|
|
|
|
# y virJSONValueFree
|
|
|
|
# y virLastErrFreeData
|
|
|
|
# y virNWFilterDefFree
|
|
|
|
# y virNWFilterEntryFree
|
|
|
|
# n virNWFilterFree (returns int)
|
|
|
|
# y virNWFilterHashTableFree
|
|
|
|
# y virNWFilterIPAddrLearnReqFree
|
|
|
|
# y virNWFilterIncludeDefFree
|
2011-01-15 15:06:52 +00:00
|
|
|
# n virNWFilterFreeName (returns int)
|
|
|
|
# y virNWFilterObjFree
|
|
|
|
# n virNWFilterObjListFree FIXME
|
2010-05-17 20:38:59 +00:00
|
|
|
# y virNWFilterRuleDefFree
|
|
|
|
# n virNWFilterRuleFreeInstanceData (typedef)
|
|
|
|
# y virNWFilterRuleInstFree
|
|
|
|
# y virNetworkDefFree
|
|
|
|
# n virNetworkFree (returns int)
|
|
|
|
# n virNetworkFreeName (returns int)
|
|
|
|
# n virNodeDevCapsDefFree FIXME
|
|
|
|
# y virNodeDeviceDefFree
|
|
|
|
# n virNodeDeviceFree (returns int)
|
|
|
|
# y virNodeDeviceObjFree
|
|
|
|
# n virNodeDeviceObjListFree FIXME
|
|
|
|
# n virNodeGetCellsFreeMemory (returns int)
|
|
|
|
# n virNodeGetFreeMemory (returns non-void)
|
|
|
|
# y virSecretDefFree
|
|
|
|
# n virSecretFree (returns non-void)
|
|
|
|
# n virSecretFreeName (2 args)
|
|
|
|
# n virSecurityLabelDefFree FIXME
|
|
|
|
# n virStorageBackendDiskMakeFreeExtent (returns non-void)
|
|
|
|
# y virStorageEncryptionFree
|
|
|
|
# y virStorageEncryptionSecretFree
|
|
|
|
# n virStorageFreeType (enum)
|
|
|
|
# y virStoragePoolDefFree
|
|
|
|
# n virStoragePoolFree (returns non-void)
|
|
|
|
# n virStoragePoolFreeName (returns non-void)
|
|
|
|
# y virStoragePoolObjFree
|
|
|
|
# n virStoragePoolObjListFree FIXME
|
|
|
|
# y virStoragePoolSourceFree
|
|
|
|
# y virStorageVolDefFree
|
|
|
|
# n virStorageVolFree (returns non-void)
|
|
|
|
# n virStorageVolFreeName (returns non-void)
|
|
|
|
# n virStreamFree
|
|
|
|
|
Prepare to use maint.mk from gnulib
Since Makefile.maint will soon come from gnulib's maint.mk,
sync Makefile.maint to have the same contents (modulo minor
things). In syncing it, we have to remove some libvirt-specific
rules. Since we want to keep them (of course), put those in cfg.mk.
* Makefile.maint: Merge from gnulib's maint.mk.
* cfg.mk (sc_avoid_write): New rule. From Makefile.cfg.
(sc_prohibit_strcmp_and_strncmp): Likewise, and rename.
(sc_prohibit_asprintf, sc_prohibit_VIR_ERR_NO_MEMORY): Likewise.
(sc_prohibit_nonreentrant): Likewise.
(sc_prohibit_ctype_h): Likewise.
(sc_TAB_in_indentation, sc_avoid_ctype_macros): Likewise.
(sc_prohibit_virBufferAdd_with_string_literal): Likewise.
(sc_prohibit_gethostby): Likewise.
(sc_libvirt_unmarked_diagnostics): Likewise. Also, rename the
rule, inserting "_libvirt", since this rule is a specialization of
the one in gnulib.
* GNUmakefile: Include cfg.mk, not Makefile.cfg
* .x-sc_prohibit_strcmp_and_strncmp: New file.
* Makefile.am (EXTRA_DIST): Add .x-sc_prohibit_strcmp_and_strncmp
2009-07-06 16:28:10 +00:00
|
|
|
# Avoid uses of write(2). Either switch to streams (fwrite), or use
|
|
|
|
# the safewrite wrapper.
|
|
|
|
sc_avoid_write:
|
2017-11-03 12:09:47 +00:00
|
|
|
@prohibit='\<write *\(' \
|
|
|
|
in_vc_files='\.c$$' \
|
|
|
|
halt='consider using safewrite instead of write' \
|
2010-05-19 10:51:11 +00:00
|
|
|
$(_sc_search_regexp)
|
Prepare to use maint.mk from gnulib
Since Makefile.maint will soon come from gnulib's maint.mk,
sync Makefile.maint to have the same contents (modulo minor
things). In syncing it, we have to remove some libvirt-specific
rules. Since we want to keep them (of course), put those in cfg.mk.
* Makefile.maint: Merge from gnulib's maint.mk.
* cfg.mk (sc_avoid_write): New rule. From Makefile.cfg.
(sc_prohibit_strcmp_and_strncmp): Likewise, and rename.
(sc_prohibit_asprintf, sc_prohibit_VIR_ERR_NO_MEMORY): Likewise.
(sc_prohibit_nonreentrant): Likewise.
(sc_prohibit_ctype_h): Likewise.
(sc_TAB_in_indentation, sc_avoid_ctype_macros): Likewise.
(sc_prohibit_virBufferAdd_with_string_literal): Likewise.
(sc_prohibit_gethostby): Likewise.
(sc_libvirt_unmarked_diagnostics): Likewise. Also, rename the
rule, inserting "_libvirt", since this rule is a specialization of
the one in gnulib.
* GNUmakefile: Include cfg.mk, not Makefile.cfg
* .x-sc_prohibit_strcmp_and_strncmp: New file.
* Makefile.am (EXTRA_DIST): Add .x-sc_prohibit_strcmp_and_strncmp
2009-07-06 16:28:10 +00:00
|
|
|
|
2011-07-08 15:18:48 +00:00
|
|
|
# In debug statements, print flags as bitmask and mode_t as octal.
|
|
|
|
sc_flags_debug:
|
2017-11-03 12:09:47 +00:00
|
|
|
@prohibit='\<mode=%[0-9.]*[diuxo]' \
|
|
|
|
halt='use \"0%o\" to debug mode_t values' \
|
2011-07-08 15:18:48 +00:00
|
|
|
$(_sc_search_regexp)
|
2017-11-03 12:09:47 +00:00
|
|
|
@prohibit='[Ff]lags=%[0-9.]*l*[dioux]' \
|
|
|
|
halt='use \"0x%x\" to debug flag values' \
|
2011-07-07 17:57:43 +00:00
|
|
|
$(_sc_search_regexp)
|
|
|
|
|
|
|
|
# Prefer 'unsigned int flags', along with checks for unknown flags.
|
|
|
|
# For historical reasons, we are stuck with 'unsigned long flags' in
|
|
|
|
# migration, so check for those known 4 instances and no more in public
|
|
|
|
# API. Also check that no flags are marked unused, and 'unsigned' should
|
|
|
|
# appear before any declaration of a flags variable (achieved by
|
|
|
|
# prohibiting the word prior to the type from ending in anything other
|
|
|
|
# than d). The existence of long long, and of documentation about
|
|
|
|
# flags, makes the regex in the third test slightly harder.
|
|
|
|
sc_flags_usage:
|
2017-11-03 12:09:47 +00:00
|
|
|
@test "$$(cat $(srcdir)/include/libvirt/libvirt-domain.h \
|
|
|
|
$(srcdir)/include/libvirt/virterror.h \
|
|
|
|
$(srcdir)/include/libvirt/libvirt-qemu.h \
|
|
|
|
$(srcdir)/include/libvirt/libvirt-lxc.h \
|
|
|
|
$(srcdir)/include/libvirt/libvirt-admin.h \
|
2019-01-03 15:31:37 +00:00
|
|
|
| $(GREP) -c '\(long\|unsigned\) flags')" != 4 && \
|
2017-11-03 12:09:47 +00:00
|
|
|
{ echo '$(ME): new API should use "unsigned int flags"' 1>&2; \
|
2011-07-07 17:57:43 +00:00
|
|
|
exit 1; } || :
|
2019-10-14 13:02:40 +00:00
|
|
|
@prohibit=' flags G_GNUC_UNUSED' \
|
2019-01-23 10:50:33 +00:00
|
|
|
exclude='virSecurityDomainImageLabelFlags' \
|
2017-11-03 12:09:47 +00:00
|
|
|
halt='flags should be checked with virCheckFlags' \
|
2011-07-07 17:57:43 +00:00
|
|
|
$(_sc_search_regexp)
|
2017-11-03 12:09:47 +00:00
|
|
|
@prohibit='^[^@]*([^d] (int|long long)|[^dg] long) flags[;,)]' \
|
|
|
|
halt='flags should be unsigned' \
|
2011-07-08 15:18:48 +00:00
|
|
|
$(_sc_search_regexp)
|
|
|
|
|
2011-09-20 18:11:32 +00:00
|
|
|
# Avoid functions that should only be called via macro counterparts.
|
|
|
|
sc_prohibit_internal_functions:
|
util: add VIR_(APPEND|INSERT|DELETE)_ELEMENT
I noticed when writing the backend functions for virNetworkUpdate that
I was repeating the same sequence of memmove, VIR_REALLOC, nXXX-- (and
messed up the args to memmove at least once), and had seen the same
sequence in a lot of other places, so I decided to write a few
utility functions/macros - see the .h file for full documentation.
The intent is to reduce the number of lines of code, but more
importantly to eliminate the need to check the element size and
element count arithmetic every time we need to do this (I *always*
make at least one mistake.)
VIR_INSERT_ELEMENT: insert one element at an arbitrary index within an
array of objects. The size of each object is determined
automatically by the macro using sizeof(*array). The new element's
contents are copied into the inserted space, then the original copy
of contents are 0'ed out (if everything else was
successful). Compile-time assignment and size compatibility between
the array and the new element is guaranteed (see explanation below
[*])
VIR_INSERT_ELEMENT_COPY: identical to VIR_INSERT_ELEMENT, except that
the original contents of newelem are not cleared to 0 (i.e. a copy
is made).
VIR_APPEND_ELEMENT: This is just a special case of VIR_INSERT_ELEMENT
that "inserts" one past the current last element.
VIR_APPEND_ELEMENT_COPY: identical to VIR_APPEND_ELEMENT, except that
the original contents of newelem are not cleared to 0 (i.e. a copy
is made).
VIR_DELETE_ELEMENT: delete one element at an arbitrary index within an
array of objects. It's assumed that the element being deleted is
already saved elsewhere (or cleared, if that's what is appropriate).
All five of these macros have an _INPLACE variant, which skips the
memory re-allocation of the array, assuming that the caller has
already done it (when inserting) or will do it later (when deleting).
Note that VIR_DELETE_ELEMENT* can return a failure, but only if an
invalid index is given (index + amount to delete is > current array
size), so in most cases you can safely ignore the return (that's why
the helper function virDeleteElementsN isn't declared with
ATTRIBUTE_RETURN_CHECK). A warning is logged if this ever happens,
since it is surely a coding error.
[*] One initial problem with the INSERT and APPEND macros was that,
due to both the array pointer and newelem pointer being cast to void*
when passing to virInsertElementsN(), any chance of type-checking was
lost. If we were going to move in newelem with a memmove anyway, we
would be no worse off for this. However, most current open-coded
insert/append operations use direct struct assignment to move the new
element into place (or just populate the new element directly) - thus
use of the new macros would open a possibility for new usage errors
that didn't exist before (e.g. accidentally sending &newelemptr rather
than newelemptr - I actually did this quite a lot in my test
conversions of existing code).
But thanks to Eric Blake's clever thinking, I was able to modify the
INSERT and APPEND macros so that they *do* check for both assignment
and size compatibility of *ptr (an element in the array) and newelem
(the element being copied into the new position of the array). This is
done via clever use of the C89-guaranteed fact that the sizeof()
operator must have *no* side effects (so an assignment inside sizeof()
is checked for validity, but not actually evaluated), and the fact
that virInsertElementsN has a "# of new elements" argument that we
want to always be 1.
2012-10-08 17:33:35 +00:00
|
|
|
@prohibit='vir(Free|AllocN?|ReallocN|(Insert|Delete)ElementsN|File(Close|Fclose|Fdopen)) *\(' \
|
2017-11-03 12:09:47 +00:00
|
|
|
halt='use VIR_ macros instead of internal functions' \
|
2011-09-20 18:11:32 +00:00
|
|
|
$(_sc_search_regexp)
|
|
|
|
|
2018-04-13 14:41:17 +00:00
|
|
|
sc_prohibit_raw_virclassnew:
|
|
|
|
@prohibit='virClassNew *\(' \
|
|
|
|
halt='use VIR_CLASS_NEW instead of virClassNew' \
|
|
|
|
$(_sc_search_regexp)
|
|
|
|
|
2012-02-02 22:47:04 +00:00
|
|
|
# Avoid raw malloc and free, except in documentation comments.
|
|
|
|
sc_prohibit_raw_allocation:
|
2017-11-03 12:09:47 +00:00
|
|
|
@prohibit='^.[^*].*\<((m|c|re)alloc|free) *\([^)]' \
|
|
|
|
halt='use VIR_ macros from viralloc.h instead of malloc/free' \
|
2012-02-02 22:47:04 +00:00
|
|
|
$(_sc_search_regexp)
|
|
|
|
|
2010-11-20 00:25:23 +00:00
|
|
|
# Avoid functions that can lead to double-close bugs.
|
|
|
|
sc_prohibit_close:
|
2017-11-03 12:09:47 +00:00
|
|
|
@prohibit='([^>.]|^)\<[fp]?close *\(' \
|
|
|
|
halt='use VIR_{FORCE_}[F]CLOSE instead of [f]close' \
|
2010-11-20 00:25:23 +00:00
|
|
|
$(_sc_search_regexp)
|
2017-11-03 12:09:47 +00:00
|
|
|
@prohibit='\<fdopen *\(' \
|
|
|
|
halt='use VIR_FDOPEN instead of fdopen' \
|
2010-11-20 00:25:23 +00:00
|
|
|
$(_sc_search_regexp)
|
|
|
|
|
maint: reject raw close, popen in 'make syntax-check'
commit f1fe9671e was supposed to make sure we use files.h
macros to avoid double close, but it didn't work.
Meanwhile, virCommand is vastly superior to system(), fork(),
and popen() (also to virExec, but we haven't completed that
conversion), so enforce that, too.
* cfg.mk (sc_prohibit_close): Fix typo that excluded close, and
add pclose.
(sc_prohibit_fork_wrappers): New rule, for fork, system, and popen.
* .x-sc_prohibit_close: More exemptions.
* .x-sc_prohibit_fork_wrappers: New file.
* Makefile.am (syntax_check_exceptions): Ship new file.
* src/datatypes.c (virReleaseConnect): Tweak comment to avoid
false positive.
* src/util/files.h (VIR_CLOSE): Likewise.
2011-01-27 22:16:14 +00:00
|
|
|
# Prefer virCommand for all child processes.
|
|
|
|
sc_prohibit_fork_wrappers:
|
2017-11-03 12:09:47 +00:00
|
|
|
@prohibit='= *\<(fork|popen|system) *\(' \
|
|
|
|
halt='use virCommand for child processes' \
|
maint: reject raw close, popen in 'make syntax-check'
commit f1fe9671e was supposed to make sure we use files.h
macros to avoid double close, but it didn't work.
Meanwhile, virCommand is vastly superior to system(), fork(),
and popen() (also to virExec, but we haven't completed that
conversion), so enforce that, too.
* cfg.mk (sc_prohibit_close): Fix typo that excluded close, and
add pclose.
(sc_prohibit_fork_wrappers): New rule, for fork, system, and popen.
* .x-sc_prohibit_close: More exemptions.
* .x-sc_prohibit_fork_wrappers: New file.
* Makefile.am (syntax_check_exceptions): Ship new file.
* src/datatypes.c (virReleaseConnect): Tweak comment to avoid
false positive.
* src/util/files.h (VIR_CLOSE): Likewise.
2011-01-27 22:16:14 +00:00
|
|
|
$(_sc_search_regexp)
|
|
|
|
|
2019-11-14 13:44:24 +00:00
|
|
|
# Prefer g_mkostemp_full with O_CLOEXEC.
|
2012-10-31 14:13:47 +00:00
|
|
|
sc_prohibit_mkstemp:
|
2019-11-14 13:44:24 +00:00
|
|
|
@prohibit='[^"]\<mko?stemps? *\(' \
|
|
|
|
in_vc_files='\.[chx]$$' \
|
|
|
|
halt='use g_mkstemp_full with O_CLOEXEC instead of mkstemp' \
|
|
|
|
$(_sc_search_regexp)
|
|
|
|
|
|
|
|
sc_prohibit_mkdtemp:
|
|
|
|
@prohibit='[^"]\<mkdtemp *\(' \
|
|
|
|
in_vc_files='\.[chx]$$' \
|
|
|
|
halt='use g_mkdtemp instead of mkdtemp' \
|
2012-10-31 14:13:47 +00:00
|
|
|
$(_sc_search_regexp)
|
|
|
|
|
2011-03-18 20:41:13 +00:00
|
|
|
# access with X_OK accepts directories, but we can't exec() those.
|
|
|
|
# access with F_OK or R_OK is okay, though.
|
|
|
|
sc_prohibit_access_xok:
|
2017-11-03 12:09:47 +00:00
|
|
|
@prohibit='access(at)? *\(.*X_OK' \
|
2019-08-30 12:22:54 +00:00
|
|
|
in_vc_files='\.[ch]$$' \
|
2017-11-03 12:09:47 +00:00
|
|
|
halt='use virFileIsExecutable instead of access(,X_OK)' \
|
2011-03-18 20:41:13 +00:00
|
|
|
$(_sc_search_regexp)
|
|
|
|
|
2019-10-02 16:51:19 +00:00
|
|
|
# Similar to the gnulib syntax-check.mk rule for sc_prohibit_strcmp
|
2010-11-17 23:41:31 +00:00
|
|
|
# Use STREQLEN or STRPREFIX rather than comparing strncmp == 0, or != 0.
|
2012-02-24 19:01:15 +00:00
|
|
|
snp_ = strncmp *\(.+\)
|
2010-11-17 23:41:31 +00:00
|
|
|
sc_prohibit_strncmp:
|
2017-11-03 12:09:47 +00:00
|
|
|
@prohibit='! *strncmp *\(|\<$(snp_) *[!=]=|[!=]= *$(snp_)' \
|
|
|
|
exclude=':# *define STR(N?EQLEN|PREFIX)\(' \
|
|
|
|
halt='use STREQLEN or STRPREFIX instead of strncmp' \
|
2012-03-02 00:21:08 +00:00
|
|
|
$(_sc_search_regexp)
|
Prepare to use maint.mk from gnulib
Since Makefile.maint will soon come from gnulib's maint.mk,
sync Makefile.maint to have the same contents (modulo minor
things). In syncing it, we have to remove some libvirt-specific
rules. Since we want to keep them (of course), put those in cfg.mk.
* Makefile.maint: Merge from gnulib's maint.mk.
* cfg.mk (sc_avoid_write): New rule. From Makefile.cfg.
(sc_prohibit_strcmp_and_strncmp): Likewise, and rename.
(sc_prohibit_asprintf, sc_prohibit_VIR_ERR_NO_MEMORY): Likewise.
(sc_prohibit_nonreentrant): Likewise.
(sc_prohibit_ctype_h): Likewise.
(sc_TAB_in_indentation, sc_avoid_ctype_macros): Likewise.
(sc_prohibit_virBufferAdd_with_string_literal): Likewise.
(sc_prohibit_gethostby): Likewise.
(sc_libvirt_unmarked_diagnostics): Likewise. Also, rename the
rule, inserting "_libvirt", since this rule is a specialization of
the one in gnulib.
* GNUmakefile: Include cfg.mk, not Makefile.cfg
* .x-sc_prohibit_strcmp_and_strncmp: New file.
* Makefile.am (EXTRA_DIST): Add .x-sc_prohibit_strcmp_and_strncmp
2009-07-06 16:28:10 +00:00
|
|
|
|
2012-04-19 00:06:59 +00:00
|
|
|
# strtol and friends are too easy to misuse
|
|
|
|
sc_prohibit_strtol:
|
2017-11-03 12:09:47 +00:00
|
|
|
@prohibit='\bstrto(u?ll?|[ui]max) *\(' \
|
|
|
|
exclude='exempt from syntax-check' \
|
|
|
|
halt='use virStrToLong_*, not strtol variants' \
|
2012-04-19 00:06:59 +00:00
|
|
|
$(_sc_search_regexp)
|
2017-11-03 12:09:47 +00:00
|
|
|
@prohibit='\bstrto[df] *\(' \
|
|
|
|
exclude='exempt from syntax-check' \
|
|
|
|
halt='use virStrToDouble, not strtod variants' \
|
2012-04-19 00:06:59 +00:00
|
|
|
$(_sc_search_regexp)
|
|
|
|
|
2019-10-22 11:17:18 +00:00
|
|
|
# Use g_strdup_printf rather than as'printf since *strp is undefined on error.
|
|
|
|
# But for plain %s, g_strdup_printf is overkill compared to g_strdup.
|
Prepare to use maint.mk from gnulib
Since Makefile.maint will soon come from gnulib's maint.mk,
sync Makefile.maint to have the same contents (modulo minor
things). In syncing it, we have to remove some libvirt-specific
rules. Since we want to keep them (of course), put those in cfg.mk.
* Makefile.maint: Merge from gnulib's maint.mk.
* cfg.mk (sc_avoid_write): New rule. From Makefile.cfg.
(sc_prohibit_strcmp_and_strncmp): Likewise, and rename.
(sc_prohibit_asprintf, sc_prohibit_VIR_ERR_NO_MEMORY): Likewise.
(sc_prohibit_nonreentrant): Likewise.
(sc_prohibit_ctype_h): Likewise.
(sc_TAB_in_indentation, sc_avoid_ctype_macros): Likewise.
(sc_prohibit_virBufferAdd_with_string_literal): Likewise.
(sc_prohibit_gethostby): Likewise.
(sc_libvirt_unmarked_diagnostics): Likewise. Also, rename the
rule, inserting "_libvirt", since this rule is a specialization of
the one in gnulib.
* GNUmakefile: Include cfg.mk, not Makefile.cfg
* .x-sc_prohibit_strcmp_and_strncmp: New file.
* Makefile.am (EXTRA_DIST): Add .x-sc_prohibit_strcmp_and_strncmp
2009-07-06 16:28:10 +00:00
|
|
|
sc_prohibit_asprintf:
|
2017-11-03 12:09:47 +00:00
|
|
|
@prohibit='\<v?a[s]printf\>' \
|
2019-10-22 11:17:18 +00:00
|
|
|
halt='use g_strdup_printf, not asprintf' \
|
2010-08-18 23:31:39 +00:00
|
|
|
$(_sc_search_regexp)
|
2019-10-22 11:17:18 +00:00
|
|
|
@prohibit='g_strdup_printf.*, *"%s",' \
|
|
|
|
halt='use g_strdup instead of g_strdup_printf with "%s"' \
|
2013-04-04 18:16:43 +00:00
|
|
|
$(_sc_search_regexp)
|
|
|
|
|
2019-11-13 09:21:29 +00:00
|
|
|
sc_prohobit_vsnprintf:
|
|
|
|
@prohibit='\<vsnprintf\>' \
|
|
|
|
in_vc_files='\.[chx]$$' \
|
|
|
|
halt='use g_vsnprintf, not vsnprintf' \
|
|
|
|
$(_sc_search_regexp)
|
|
|
|
|
2013-04-04 18:16:43 +00:00
|
|
|
sc_prohibit_strdup:
|
2017-11-03 12:09:47 +00:00
|
|
|
@prohibit='\<strn?dup\> *\(' \
|
|
|
|
halt='use VIR_STRDUP, not strdup' \
|
2013-05-02 19:35:26 +00:00
|
|
|
$(_sc_search_regexp)
|
2010-08-18 23:31:39 +00:00
|
|
|
|
2011-06-22 22:18:01 +00:00
|
|
|
# Prefer virSetUIDGID.
|
|
|
|
sc_prohibit_setuid:
|
2017-11-03 12:09:47 +00:00
|
|
|
@prohibit='\<set(re)?[ug]id\> *\(' \
|
|
|
|
halt='use virSetUIDGID, not raw set*id' \
|
2011-06-22 22:18:01 +00:00
|
|
|
$(_sc_search_regexp)
|
|
|
|
|
2013-03-14 22:28:29 +00:00
|
|
|
# Don't compare *id_t against raw -1.
|
|
|
|
sc_prohibit_risky_id_promotion:
|
2017-11-03 12:09:47 +00:00
|
|
|
@prohibit='\b(user|group|[ug]id) *[=!]= *-' \
|
|
|
|
halt='cast -1 to ([ug]id_t) before comparing against id' \
|
2013-03-14 22:28:29 +00:00
|
|
|
$(_sc_search_regexp)
|
|
|
|
|
2019-11-13 16:33:26 +00:00
|
|
|
# Use g_snprintf rather than s'printf, even if buffer is provably large enough,
|
2010-08-18 23:31:39 +00:00
|
|
|
# since gnulib has more guarantees for snprintf portability
|
|
|
|
sc_prohibit_sprintf:
|
2017-11-03 12:09:47 +00:00
|
|
|
@prohibit='\<[s]printf\>' \
|
2019-08-30 12:22:54 +00:00
|
|
|
in_vc_files='\.[ch]$$' \
|
2019-11-13 16:33:26 +00:00
|
|
|
halt='use g_snprintf, not sprintf' \
|
build: import latest gnulib
A lot of syntax check rules have to be rewritten, but the
result is easier to maintain. I tested each syntax rule
by intentionally introducing a temporary violation of the rule.
Additionally, some false positives for unmarked_diagnostics
crept in, and an improved copyright_format test caught some bugs.
* .gnulib: Update to latest.
* cfg.mk (sc_prohibit_test_minus_ao): Delete, it was moved into
gnulib's maint.mk.
(sc_avoid_write, sc_prohibit_strcmp_and_strncmp)
(sc_prohibit_asprintf, sc_prohibit_strncpy, sc_prohibit_readlink)
(sc_prohibit_gethostname, sc_prohibit_gettext_noop)
(sc_prohibit_VIR_ERR_NO_MEMORY, sc_prohibit_nonreentrant)
(sc_prohibit_ctype_h, sc_TAB_in_indentation)
(sc_avoid_ctype_macros)
(sc_prohibit_virBufferAdd_with_string_literal)
(sc_prohibit_gethostby, sc_copyright_format): Rewrite in terms of
new maint.mk macros.
(sc_libvirt_unmarked_diagnostics): Fix whitespace.
* .x-sc_unmarked_diagnostics: New file.
* tests/object-locking.ml: Fix copyright.
* tools/virt-pki-validate.in: Likewise.
* tools/virt-xml-validate.in: Likewise.
2010-03-31 23:02:10 +00:00
|
|
|
$(_sc_search_regexp)
|
Prepare to use maint.mk from gnulib
Since Makefile.maint will soon come from gnulib's maint.mk,
sync Makefile.maint to have the same contents (modulo minor
things). In syncing it, we have to remove some libvirt-specific
rules. Since we want to keep them (of course), put those in cfg.mk.
* Makefile.maint: Merge from gnulib's maint.mk.
* cfg.mk (sc_avoid_write): New rule. From Makefile.cfg.
(sc_prohibit_strcmp_and_strncmp): Likewise, and rename.
(sc_prohibit_asprintf, sc_prohibit_VIR_ERR_NO_MEMORY): Likewise.
(sc_prohibit_nonreentrant): Likewise.
(sc_prohibit_ctype_h): Likewise.
(sc_TAB_in_indentation, sc_avoid_ctype_macros): Likewise.
(sc_prohibit_virBufferAdd_with_string_literal): Likewise.
(sc_prohibit_gethostby): Likewise.
(sc_libvirt_unmarked_diagnostics): Likewise. Also, rename the
rule, inserting "_libvirt", since this rule is a specialization of
the one in gnulib.
* GNUmakefile: Include cfg.mk, not Makefile.cfg
* .x-sc_prohibit_strcmp_and_strncmp: New file.
* Makefile.am (EXTRA_DIST): Add .x-sc_prohibit_strcmp_and_strncmp
2009-07-06 16:28:10 +00:00
|
|
|
|
2019-11-13 16:33:27 +00:00
|
|
|
sc_prohibit_snprintf:
|
|
|
|
@prohibit='\<snprintf\>' \
|
|
|
|
halt='use g_snprintf, not snprintf' \
|
|
|
|
$(_sc_search_regexp)
|
|
|
|
|
2009-12-21 19:14:46 +00:00
|
|
|
sc_prohibit_readlink:
|
2017-11-03 12:09:47 +00:00
|
|
|
@prohibit='\<readlink *\(' \
|
|
|
|
halt='use virFileResolveLink, not readlink' \
|
build: import latest gnulib
A lot of syntax check rules have to be rewritten, but the
result is easier to maintain. I tested each syntax rule
by intentionally introducing a temporary violation of the rule.
Additionally, some false positives for unmarked_diagnostics
crept in, and an improved copyright_format test caught some bugs.
* .gnulib: Update to latest.
* cfg.mk (sc_prohibit_test_minus_ao): Delete, it was moved into
gnulib's maint.mk.
(sc_avoid_write, sc_prohibit_strcmp_and_strncmp)
(sc_prohibit_asprintf, sc_prohibit_strncpy, sc_prohibit_readlink)
(sc_prohibit_gethostname, sc_prohibit_gettext_noop)
(sc_prohibit_VIR_ERR_NO_MEMORY, sc_prohibit_nonreentrant)
(sc_prohibit_ctype_h, sc_TAB_in_indentation)
(sc_avoid_ctype_macros)
(sc_prohibit_virBufferAdd_with_string_literal)
(sc_prohibit_gethostby, sc_copyright_format): Rewrite in terms of
new maint.mk macros.
(sc_libvirt_unmarked_diagnostics): Fix whitespace.
* .x-sc_unmarked_diagnostics: New file.
* tests/object-locking.ml: Fix copyright.
* tools/virt-pki-validate.in: Likewise.
* tools/virt-xml-validate.in: Likewise.
2010-03-31 23:02:10 +00:00
|
|
|
$(_sc_search_regexp)
|
2009-12-21 19:14:46 +00:00
|
|
|
|
2009-10-23 10:13:20 +00:00
|
|
|
sc_prohibit_gethostname:
|
2017-11-03 12:09:47 +00:00
|
|
|
@prohibit='gethostname *\(' \
|
|
|
|
halt='use virGetHostname, not gethostname' \
|
build: import latest gnulib
A lot of syntax check rules have to be rewritten, but the
result is easier to maintain. I tested each syntax rule
by intentionally introducing a temporary violation of the rule.
Additionally, some false positives for unmarked_diagnostics
crept in, and an improved copyright_format test caught some bugs.
* .gnulib: Update to latest.
* cfg.mk (sc_prohibit_test_minus_ao): Delete, it was moved into
gnulib's maint.mk.
(sc_avoid_write, sc_prohibit_strcmp_and_strncmp)
(sc_prohibit_asprintf, sc_prohibit_strncpy, sc_prohibit_readlink)
(sc_prohibit_gethostname, sc_prohibit_gettext_noop)
(sc_prohibit_VIR_ERR_NO_MEMORY, sc_prohibit_nonreentrant)
(sc_prohibit_ctype_h, sc_TAB_in_indentation)
(sc_avoid_ctype_macros)
(sc_prohibit_virBufferAdd_with_string_literal)
(sc_prohibit_gethostby, sc_copyright_format): Rewrite in terms of
new maint.mk macros.
(sc_libvirt_unmarked_diagnostics): Fix whitespace.
* .x-sc_unmarked_diagnostics: New file.
* tests/object-locking.ml: Fix copyright.
* tools/virt-pki-validate.in: Likewise.
* tools/virt-xml-validate.in: Likewise.
2010-03-31 23:02:10 +00:00
|
|
|
$(_sc_search_regexp)
|
2009-10-23 10:13:20 +00:00
|
|
|
|
2014-04-21 22:33:15 +00:00
|
|
|
sc_prohibit_readdir:
|
2017-11-03 12:09:47 +00:00
|
|
|
@prohibit='\b(read|close|open)dir *\(' \
|
|
|
|
exclude='exempt from syntax-check' \
|
|
|
|
halt='use virDirOpen, virDirRead and VIR_DIR_CLOSE' \
|
2014-04-21 22:33:15 +00:00
|
|
|
$(_sc_search_regexp)
|
|
|
|
|
2010-03-18 13:05:44 +00:00
|
|
|
sc_prohibit_gettext_noop:
|
2017-11-03 12:09:47 +00:00
|
|
|
@prohibit='gettext_noop *\(' \
|
|
|
|
halt='use N_, not gettext_noop' \
|
build: import latest gnulib
A lot of syntax check rules have to be rewritten, but the
result is easier to maintain. I tested each syntax rule
by intentionally introducing a temporary violation of the rule.
Additionally, some false positives for unmarked_diagnostics
crept in, and an improved copyright_format test caught some bugs.
* .gnulib: Update to latest.
* cfg.mk (sc_prohibit_test_minus_ao): Delete, it was moved into
gnulib's maint.mk.
(sc_avoid_write, sc_prohibit_strcmp_and_strncmp)
(sc_prohibit_asprintf, sc_prohibit_strncpy, sc_prohibit_readlink)
(sc_prohibit_gethostname, sc_prohibit_gettext_noop)
(sc_prohibit_VIR_ERR_NO_MEMORY, sc_prohibit_nonreentrant)
(sc_prohibit_ctype_h, sc_TAB_in_indentation)
(sc_avoid_ctype_macros)
(sc_prohibit_virBufferAdd_with_string_literal)
(sc_prohibit_gethostby, sc_copyright_format): Rewrite in terms of
new maint.mk macros.
(sc_libvirt_unmarked_diagnostics): Fix whitespace.
* .x-sc_unmarked_diagnostics: New file.
* tests/object-locking.ml: Fix copyright.
* tools/virt-pki-validate.in: Likewise.
* tools/virt-xml-validate.in: Likewise.
2010-03-31 23:02:10 +00:00
|
|
|
$(_sc_search_regexp)
|
2010-03-18 13:05:44 +00:00
|
|
|
|
Prepare to use maint.mk from gnulib
Since Makefile.maint will soon come from gnulib's maint.mk,
sync Makefile.maint to have the same contents (modulo minor
things). In syncing it, we have to remove some libvirt-specific
rules. Since we want to keep them (of course), put those in cfg.mk.
* Makefile.maint: Merge from gnulib's maint.mk.
* cfg.mk (sc_avoid_write): New rule. From Makefile.cfg.
(sc_prohibit_strcmp_and_strncmp): Likewise, and rename.
(sc_prohibit_asprintf, sc_prohibit_VIR_ERR_NO_MEMORY): Likewise.
(sc_prohibit_nonreentrant): Likewise.
(sc_prohibit_ctype_h): Likewise.
(sc_TAB_in_indentation, sc_avoid_ctype_macros): Likewise.
(sc_prohibit_virBufferAdd_with_string_literal): Likewise.
(sc_prohibit_gethostby): Likewise.
(sc_libvirt_unmarked_diagnostics): Likewise. Also, rename the
rule, inserting "_libvirt", since this rule is a specialization of
the one in gnulib.
* GNUmakefile: Include cfg.mk, not Makefile.cfg
* .x-sc_prohibit_strcmp_and_strncmp: New file.
* Makefile.am (EXTRA_DIST): Add .x-sc_prohibit_strcmp_and_strncmp
2009-07-06 16:28:10 +00:00
|
|
|
sc_prohibit_VIR_ERR_NO_MEMORY:
|
2017-11-03 12:09:47 +00:00
|
|
|
@prohibit='\<VIR_ERR_NO_MEMORY\>' \
|
|
|
|
halt='use virReportOOMError, not VIR_ERR_NO_MEMORY' \
|
build: import latest gnulib
A lot of syntax check rules have to be rewritten, but the
result is easier to maintain. I tested each syntax rule
by intentionally introducing a temporary violation of the rule.
Additionally, some false positives for unmarked_diagnostics
crept in, and an improved copyright_format test caught some bugs.
* .gnulib: Update to latest.
* cfg.mk (sc_prohibit_test_minus_ao): Delete, it was moved into
gnulib's maint.mk.
(sc_avoid_write, sc_prohibit_strcmp_and_strncmp)
(sc_prohibit_asprintf, sc_prohibit_strncpy, sc_prohibit_readlink)
(sc_prohibit_gethostname, sc_prohibit_gettext_noop)
(sc_prohibit_VIR_ERR_NO_MEMORY, sc_prohibit_nonreentrant)
(sc_prohibit_ctype_h, sc_TAB_in_indentation)
(sc_avoid_ctype_macros)
(sc_prohibit_virBufferAdd_with_string_literal)
(sc_prohibit_gethostby, sc_copyright_format): Rewrite in terms of
new maint.mk macros.
(sc_libvirt_unmarked_diagnostics): Fix whitespace.
* .x-sc_unmarked_diagnostics: New file.
* tests/object-locking.ml: Fix copyright.
* tools/virt-pki-validate.in: Likewise.
* tools/virt-xml-validate.in: Likewise.
2010-03-31 23:02:10 +00:00
|
|
|
$(_sc_search_regexp)
|
Prepare to use maint.mk from gnulib
Since Makefile.maint will soon come from gnulib's maint.mk,
sync Makefile.maint to have the same contents (modulo minor
things). In syncing it, we have to remove some libvirt-specific
rules. Since we want to keep them (of course), put those in cfg.mk.
* Makefile.maint: Merge from gnulib's maint.mk.
* cfg.mk (sc_avoid_write): New rule. From Makefile.cfg.
(sc_prohibit_strcmp_and_strncmp): Likewise, and rename.
(sc_prohibit_asprintf, sc_prohibit_VIR_ERR_NO_MEMORY): Likewise.
(sc_prohibit_nonreentrant): Likewise.
(sc_prohibit_ctype_h): Likewise.
(sc_TAB_in_indentation, sc_avoid_ctype_macros): Likewise.
(sc_prohibit_virBufferAdd_with_string_literal): Likewise.
(sc_prohibit_gethostby): Likewise.
(sc_libvirt_unmarked_diagnostics): Likewise. Also, rename the
rule, inserting "_libvirt", since this rule is a specialization of
the one in gnulib.
* GNUmakefile: Include cfg.mk, not Makefile.cfg
* .x-sc_prohibit_strcmp_and_strncmp: New file.
* Makefile.am (EXTRA_DIST): Add .x-sc_prohibit_strcmp_and_strncmp
2009-07-06 16:28:10 +00:00
|
|
|
|
2012-05-25 13:14:07 +00:00
|
|
|
sc_prohibit_PATH_MAX:
|
2017-11-03 12:09:47 +00:00
|
|
|
@prohibit='\<PATH_MAX\>' \
|
|
|
|
halt='dynamically allocate paths, do not use PATH_MAX' \
|
2012-05-25 13:14:07 +00:00
|
|
|
$(_sc_search_regexp)
|
|
|
|
|
2009-10-01 14:55:09 +00:00
|
|
|
include $(srcdir)/Makefile.nonreentrant
|
Prepare to use maint.mk from gnulib
Since Makefile.maint will soon come from gnulib's maint.mk,
sync Makefile.maint to have the same contents (modulo minor
things). In syncing it, we have to remove some libvirt-specific
rules. Since we want to keep them (of course), put those in cfg.mk.
* Makefile.maint: Merge from gnulib's maint.mk.
* cfg.mk (sc_avoid_write): New rule. From Makefile.cfg.
(sc_prohibit_strcmp_and_strncmp): Likewise, and rename.
(sc_prohibit_asprintf, sc_prohibit_VIR_ERR_NO_MEMORY): Likewise.
(sc_prohibit_nonreentrant): Likewise.
(sc_prohibit_ctype_h): Likewise.
(sc_TAB_in_indentation, sc_avoid_ctype_macros): Likewise.
(sc_prohibit_virBufferAdd_with_string_literal): Likewise.
(sc_prohibit_gethostby): Likewise.
(sc_libvirt_unmarked_diagnostics): Likewise. Also, rename the
rule, inserting "_libvirt", since this rule is a specialization of
the one in gnulib.
* GNUmakefile: Include cfg.mk, not Makefile.cfg
* .x-sc_prohibit_strcmp_and_strncmp: New file.
* Makefile.am (EXTRA_DIST): Add .x-sc_prohibit_strcmp_and_strncmp
2009-07-06 16:28:10 +00:00
|
|
|
sc_prohibit_nonreentrant:
|
2017-11-03 12:09:47 +00:00
|
|
|
@prohibit="\\<(${NON_REENTRANT_RE}) *\\(" \
|
|
|
|
halt="use re-entrant functions (usually ending with _r)" \
|
2016-06-14 12:27:51 +00:00
|
|
|
$(_sc_search_regexp)
|
Prepare to use maint.mk from gnulib
Since Makefile.maint will soon come from gnulib's maint.mk,
sync Makefile.maint to have the same contents (modulo minor
things). In syncing it, we have to remove some libvirt-specific
rules. Since we want to keep them (of course), put those in cfg.mk.
* Makefile.maint: Merge from gnulib's maint.mk.
* cfg.mk (sc_avoid_write): New rule. From Makefile.cfg.
(sc_prohibit_strcmp_and_strncmp): Likewise, and rename.
(sc_prohibit_asprintf, sc_prohibit_VIR_ERR_NO_MEMORY): Likewise.
(sc_prohibit_nonreentrant): Likewise.
(sc_prohibit_ctype_h): Likewise.
(sc_TAB_in_indentation, sc_avoid_ctype_macros): Likewise.
(sc_prohibit_virBufferAdd_with_string_literal): Likewise.
(sc_prohibit_gethostby): Likewise.
(sc_libvirt_unmarked_diagnostics): Likewise. Also, rename the
rule, inserting "_libvirt", since this rule is a specialization of
the one in gnulib.
* GNUmakefile: Include cfg.mk, not Makefile.cfg
* .x-sc_prohibit_strcmp_and_strncmp: New file.
* Makefile.am (EXTRA_DIST): Add .x-sc_prohibit_strcmp_and_strncmp
2009-07-06 16:28:10 +00:00
|
|
|
|
2013-05-13 13:43:20 +00:00
|
|
|
sc_prohibit_select:
|
2017-11-03 12:09:47 +00:00
|
|
|
@prohibit='\<select *\(' \
|
|
|
|
halt='use poll(), not select()' \
|
2013-05-13 13:43:20 +00:00
|
|
|
$(_sc_search_regexp)
|
|
|
|
|
Prepare to use maint.mk from gnulib
Since Makefile.maint will soon come from gnulib's maint.mk,
sync Makefile.maint to have the same contents (modulo minor
things). In syncing it, we have to remove some libvirt-specific
rules. Since we want to keep them (of course), put those in cfg.mk.
* Makefile.maint: Merge from gnulib's maint.mk.
* cfg.mk (sc_avoid_write): New rule. From Makefile.cfg.
(sc_prohibit_strcmp_and_strncmp): Likewise, and rename.
(sc_prohibit_asprintf, sc_prohibit_VIR_ERR_NO_MEMORY): Likewise.
(sc_prohibit_nonreentrant): Likewise.
(sc_prohibit_ctype_h): Likewise.
(sc_TAB_in_indentation, sc_avoid_ctype_macros): Likewise.
(sc_prohibit_virBufferAdd_with_string_literal): Likewise.
(sc_prohibit_gethostby): Likewise.
(sc_libvirt_unmarked_diagnostics): Likewise. Also, rename the
rule, inserting "_libvirt", since this rule is a specialization of
the one in gnulib.
* GNUmakefile: Include cfg.mk, not Makefile.cfg
* .x-sc_prohibit_strcmp_and_strncmp: New file.
* Makefile.am (EXTRA_DIST): Add .x-sc_prohibit_strcmp_and_strncmp
2009-07-06 16:28:10 +00:00
|
|
|
# Prohibit the inclusion of <ctype.h>.
|
|
|
|
sc_prohibit_ctype_h:
|
2017-11-03 12:09:47 +00:00
|
|
|
@prohibit='^# *include *<ctype\.h>' \
|
2019-11-18 15:20:17 +00:00
|
|
|
halt='use Glib g_ascii_* function instead of ctype.h' \
|
2010-05-19 10:51:11 +00:00
|
|
|
$(_sc_search_regexp)
|
Prepare to use maint.mk from gnulib
Since Makefile.maint will soon come from gnulib's maint.mk,
sync Makefile.maint to have the same contents (modulo minor
things). In syncing it, we have to remove some libvirt-specific
rules. Since we want to keep them (of course), put those in cfg.mk.
* Makefile.maint: Merge from gnulib's maint.mk.
* cfg.mk (sc_avoid_write): New rule. From Makefile.cfg.
(sc_prohibit_strcmp_and_strncmp): Likewise, and rename.
(sc_prohibit_asprintf, sc_prohibit_VIR_ERR_NO_MEMORY): Likewise.
(sc_prohibit_nonreentrant): Likewise.
(sc_prohibit_ctype_h): Likewise.
(sc_TAB_in_indentation, sc_avoid_ctype_macros): Likewise.
(sc_prohibit_virBufferAdd_with_string_literal): Likewise.
(sc_prohibit_gethostby): Likewise.
(sc_libvirt_unmarked_diagnostics): Likewise. Also, rename the
rule, inserting "_libvirt", since this rule is a specialization of
the one in gnulib.
* GNUmakefile: Include cfg.mk, not Makefile.cfg
* .x-sc_prohibit_strcmp_and_strncmp: New file.
* Makefile.am (EXTRA_DIST): Add .x-sc_prohibit_strcmp_and_strncmp
2009-07-06 16:28:10 +00:00
|
|
|
|
2018-04-30 14:55:57 +00:00
|
|
|
# We have our own wrapper for mocking purposes
|
|
|
|
sc_prohibit_canonicalize_file_name:
|
|
|
|
@prohibit='\<canonicalize_file_name\(' \
|
|
|
|
exclude='exempt from syntax-check' \
|
|
|
|
halt='use virFileCanonicalizePath() instead of canonicalize_file_name()' \
|
|
|
|
$(_sc_search_regexp)
|
|
|
|
|
build: use correct type for pid and similar types
No thanks to 64-bit windows, with 64-bit pid_t, we have to avoid
constructs like 'int pid'. Our API in libvirt-qemu cannot be
changed without breaking ABI; but then again, libvirt-qemu can
only be used on systems that support UNIX sockets, which rules
out Windows (even if qemu could be compiled there) - so for all
points on the call chain that interact with this API decision,
we require a different variable name to make it clear that we
audited the use for safety.
Adding a syntax-check rule only solves half the battle; anywhere
that uses printf on a pid_t still needs to be converted, but that
will be a separate patch.
* cfg.mk (sc_correct_id_types): New syntax check.
* src/libvirt-qemu.c (virDomainQemuAttach): Document why we didn't
use pid_t for pid, and validate for overflow.
* include/libvirt/libvirt-qemu.h (virDomainQemuAttach): Tweak name
for syntax check.
* src/vmware/vmware_conf.c (vmwareExtractPid): Likewise.
* src/driver.h (virDrvDomainQemuAttach): Likewise.
* tools/virsh.c (cmdQemuAttach): Likewise.
* src/remote/qemu_protocol.x (qemu_domain_attach_args): Likewise.
* src/qemu_protocol-structs (qemu_domain_attach_args): Likewise.
* src/util/cgroup.c (virCgroupPidCode, virCgroupKillInternal):
Likewise.
* src/qemu/qemu_command.c(qemuParseProcFileStrings): Likewise.
(qemuParseCommandLinePid): Use pid_t for pid.
* daemon/libvirtd.c (daemonForkIntoBackground): Likewise.
* src/conf/domain_conf.h (_virDomainObj): Likewise.
* src/probes.d (rpc_socket_new): Likewise.
* src/qemu/qemu_command.h (qemuParseCommandLinePid): Likewise.
* src/qemu/qemu_driver.c (qemudGetProcessInfo, qemuDomainAttach):
Likewise.
* src/qemu/qemu_process.c (qemuProcessAttach): Likewise.
* src/qemu/qemu_process.h (qemuProcessAttach): Likewise.
* src/uml/uml_driver.c (umlGetProcessInfo): Likewise.
* src/util/virnetdev.h (virNetDevSetNamespace): Likewise.
* src/util/virnetdev.c (virNetDevSetNamespace): Likewise.
* tests/testutils.c (virtTestCaptureProgramOutput): Likewise.
* src/conf/storage_conf.h (_virStoragePerms): Use mode_t, uid_t,
and gid_t rather than int.
* src/security/security_dac.c (virSecurityDACSetOwnership): Likewise.
* src/conf/storage_conf.c (virStorageDefParsePerms): Avoid
compiler warning.
2012-02-10 23:08:11 +00:00
|
|
|
# Insist on correct types for [pug]id.
|
|
|
|
sc_correct_id_types:
|
2017-11-03 12:09:47 +00:00
|
|
|
@prohibit='\<(int|long) *[pug]id\>' \
|
2018-11-08 11:00:19 +00:00
|
|
|
exclude='exempt from syntax-check' \
|
2017-11-03 12:09:47 +00:00
|
|
|
halt='use pid_t for pid, uid_t for uid, gid_t for gid' \
|
build: use correct type for pid and similar types
No thanks to 64-bit windows, with 64-bit pid_t, we have to avoid
constructs like 'int pid'. Our API in libvirt-qemu cannot be
changed without breaking ABI; but then again, libvirt-qemu can
only be used on systems that support UNIX sockets, which rules
out Windows (even if qemu could be compiled there) - so for all
points on the call chain that interact with this API decision,
we require a different variable name to make it clear that we
audited the use for safety.
Adding a syntax-check rule only solves half the battle; anywhere
that uses printf on a pid_t still needs to be converted, but that
will be a separate patch.
* cfg.mk (sc_correct_id_types): New syntax check.
* src/libvirt-qemu.c (virDomainQemuAttach): Document why we didn't
use pid_t for pid, and validate for overflow.
* include/libvirt/libvirt-qemu.h (virDomainQemuAttach): Tweak name
for syntax check.
* src/vmware/vmware_conf.c (vmwareExtractPid): Likewise.
* src/driver.h (virDrvDomainQemuAttach): Likewise.
* tools/virsh.c (cmdQemuAttach): Likewise.
* src/remote/qemu_protocol.x (qemu_domain_attach_args): Likewise.
* src/qemu_protocol-structs (qemu_domain_attach_args): Likewise.
* src/util/cgroup.c (virCgroupPidCode, virCgroupKillInternal):
Likewise.
* src/qemu/qemu_command.c(qemuParseProcFileStrings): Likewise.
(qemuParseCommandLinePid): Use pid_t for pid.
* daemon/libvirtd.c (daemonForkIntoBackground): Likewise.
* src/conf/domain_conf.h (_virDomainObj): Likewise.
* src/probes.d (rpc_socket_new): Likewise.
* src/qemu/qemu_command.h (qemuParseCommandLinePid): Likewise.
* src/qemu/qemu_driver.c (qemudGetProcessInfo, qemuDomainAttach):
Likewise.
* src/qemu/qemu_process.c (qemuProcessAttach): Likewise.
* src/qemu/qemu_process.h (qemuProcessAttach): Likewise.
* src/uml/uml_driver.c (umlGetProcessInfo): Likewise.
* src/util/virnetdev.h (virNetDevSetNamespace): Likewise.
* src/util/virnetdev.c (virNetDevSetNamespace): Likewise.
* tests/testutils.c (virtTestCaptureProgramOutput): Likewise.
* src/conf/storage_conf.h (_virStoragePerms): Use mode_t, uid_t,
and gid_t rather than int.
* src/security/security_dac.c (virSecurityDACSetOwnership): Likewise.
* src/conf/storage_conf.c (virStorageDefParsePerms): Avoid
compiler warning.
2012-02-10 23:08:11 +00:00
|
|
|
$(_sc_search_regexp)
|
|
|
|
|
2013-09-24 16:41:54 +00:00
|
|
|
# "const fooPtr a" is the same as "foo * const a", even though it is
|
|
|
|
# usually desired to have "foo const *a". It's easier to just prevent
|
|
|
|
# the confusing mix of typedef vs. const placement.
|
2013-10-29 19:57:19 +00:00
|
|
|
# Also requires that all 'fooPtr' typedefs are actually pointers.
|
2013-09-24 16:41:54 +00:00
|
|
|
sc_forbid_const_pointer_typedef:
|
2017-11-03 12:09:47 +00:00
|
|
|
@prohibit='(^|[^"])const \w*Ptr' \
|
|
|
|
halt='"const fooPtr var" does not declare what you meant' \
|
2013-09-24 16:41:54 +00:00
|
|
|
$(_sc_search_regexp)
|
2017-11-03 12:09:47 +00:00
|
|
|
@prohibit='typedef [^(]+ [^*]\w*Ptr\b' \
|
|
|
|
halt='use correct style and type for Ptr typedefs' \
|
2013-10-29 19:57:19 +00:00
|
|
|
$(_sc_search_regexp)
|
2013-09-24 16:41:54 +00:00
|
|
|
|
2012-03-29 09:52:04 +00:00
|
|
|
# Forbid sizeof foo or sizeof (foo), require sizeof(foo)
|
|
|
|
sc_size_of_brackets:
|
2017-11-03 12:09:47 +00:00
|
|
|
@prohibit='sizeof\s' \
|
|
|
|
halt='use sizeof(foo), not sizeof (foo) or sizeof foo' \
|
2012-03-29 09:52:04 +00:00
|
|
|
$(_sc_search_regexp)
|
|
|
|
|
2011-02-04 18:16:35 +00:00
|
|
|
# Ensure that no C source file, docs, or rng schema uses TABs for
|
2010-04-05 14:17:31 +00:00
|
|
|
# indentation. Also match *.h.in files, to get libvirt.h.in. Exclude
|
|
|
|
# files in gnulib, since they're imported.
|
2019-12-11 14:40:31 +00:00
|
|
|
space_indent_files=(\.(aug(\.in)?|rng|s?[ch](\.in)?|html.in|py|pl|syms)|tools/.*\.in)
|
Prepare to use maint.mk from gnulib
Since Makefile.maint will soon come from gnulib's maint.mk,
sync Makefile.maint to have the same contents (modulo minor
things). In syncing it, we have to remove some libvirt-specific
rules. Since we want to keep them (of course), put those in cfg.mk.
* Makefile.maint: Merge from gnulib's maint.mk.
* cfg.mk (sc_avoid_write): New rule. From Makefile.cfg.
(sc_prohibit_strcmp_and_strncmp): Likewise, and rename.
(sc_prohibit_asprintf, sc_prohibit_VIR_ERR_NO_MEMORY): Likewise.
(sc_prohibit_nonreentrant): Likewise.
(sc_prohibit_ctype_h): Likewise.
(sc_TAB_in_indentation, sc_avoid_ctype_macros): Likewise.
(sc_prohibit_virBufferAdd_with_string_literal): Likewise.
(sc_prohibit_gethostby): Likewise.
(sc_libvirt_unmarked_diagnostics): Likewise. Also, rename the
rule, inserting "_libvirt", since this rule is a specialization of
the one in gnulib.
* GNUmakefile: Include cfg.mk, not Makefile.cfg
* .x-sc_prohibit_strcmp_and_strncmp: New file.
* Makefile.am (EXTRA_DIST): Add .x-sc_prohibit_strcmp_and_strncmp
2009-07-06 16:28:10 +00:00
|
|
|
sc_TAB_in_indentation:
|
2017-11-03 12:09:47 +00:00
|
|
|
@prohibit='^ * ' \
|
|
|
|
in_vc_files='$(space_indent_files)$$' \
|
2012-01-26 14:30:36 +00:00
|
|
|
halt='indent with space, not TAB, in C, sh, html, py, syms and RNG schemas' \
|
2010-05-19 10:51:11 +00:00
|
|
|
$(_sc_search_regexp)
|
Prepare to use maint.mk from gnulib
Since Makefile.maint will soon come from gnulib's maint.mk,
sync Makefile.maint to have the same contents (modulo minor
things). In syncing it, we have to remove some libvirt-specific
rules. Since we want to keep them (of course), put those in cfg.mk.
* Makefile.maint: Merge from gnulib's maint.mk.
* cfg.mk (sc_avoid_write): New rule. From Makefile.cfg.
(sc_prohibit_strcmp_and_strncmp): Likewise, and rename.
(sc_prohibit_asprintf, sc_prohibit_VIR_ERR_NO_MEMORY): Likewise.
(sc_prohibit_nonreentrant): Likewise.
(sc_prohibit_ctype_h): Likewise.
(sc_TAB_in_indentation, sc_avoid_ctype_macros): Likewise.
(sc_prohibit_virBufferAdd_with_string_literal): Likewise.
(sc_prohibit_gethostby): Likewise.
(sc_libvirt_unmarked_diagnostics): Likewise. Also, rename the
rule, inserting "_libvirt", since this rule is a specialization of
the one in gnulib.
* GNUmakefile: Include cfg.mk, not Makefile.cfg
* .x-sc_prohibit_strcmp_and_strncmp: New file.
* Makefile.am (EXTRA_DIST): Add .x-sc_prohibit_strcmp_and_strncmp
2009-07-06 16:28:10 +00:00
|
|
|
|
|
|
|
ctype_re = isalnum|isalpha|isascii|isblank|iscntrl|isdigit|isgraph|islower\
|
|
|
|
|isprint|ispunct|isspace|isupper|isxdigit|tolower|toupper
|
|
|
|
|
|
|
|
sc_avoid_ctype_macros:
|
2017-11-03 12:09:47 +00:00
|
|
|
@prohibit='\b($(ctype_re)) *\(' \
|
2018-03-20 06:48:52 +00:00
|
|
|
in_vc_files='\.[ch]$$' \
|
2019-11-18 15:20:17 +00:00
|
|
|
halt='use Glib g_ascii_ macros instead of ctype macros' \
|
2010-05-19 10:51:11 +00:00
|
|
|
$(_sc_search_regexp)
|
Prepare to use maint.mk from gnulib
Since Makefile.maint will soon come from gnulib's maint.mk,
sync Makefile.maint to have the same contents (modulo minor
things). In syncing it, we have to remove some libvirt-specific
rules. Since we want to keep them (of course), put those in cfg.mk.
* Makefile.maint: Merge from gnulib's maint.mk.
* cfg.mk (sc_avoid_write): New rule. From Makefile.cfg.
(sc_prohibit_strcmp_and_strncmp): Likewise, and rename.
(sc_prohibit_asprintf, sc_prohibit_VIR_ERR_NO_MEMORY): Likewise.
(sc_prohibit_nonreentrant): Likewise.
(sc_prohibit_ctype_h): Likewise.
(sc_TAB_in_indentation, sc_avoid_ctype_macros): Likewise.
(sc_prohibit_virBufferAdd_with_string_literal): Likewise.
(sc_prohibit_gethostby): Likewise.
(sc_libvirt_unmarked_diagnostics): Likewise. Also, rename the
rule, inserting "_libvirt", since this rule is a specialization of
the one in gnulib.
* GNUmakefile: Include cfg.mk, not Makefile.cfg
* .x-sc_prohibit_strcmp_and_strncmp: New file.
* Makefile.am (EXTRA_DIST): Add .x-sc_prohibit_strcmp_and_strncmp
2009-07-06 16:28:10 +00:00
|
|
|
|
2011-03-31 02:26:27 +00:00
|
|
|
sc_avoid_strcase:
|
2017-11-03 12:09:47 +00:00
|
|
|
@prohibit='\bstrn?case(cmp|str) *\(' \
|
2019-11-20 14:18:59 +00:00
|
|
|
halt='use GLib strcase functions instead of raw strcase functions' \
|
2011-03-31 02:26:27 +00:00
|
|
|
$(_sc_search_regexp)
|
|
|
|
|
Prepare to use maint.mk from gnulib
Since Makefile.maint will soon come from gnulib's maint.mk,
sync Makefile.maint to have the same contents (modulo minor
things). In syncing it, we have to remove some libvirt-specific
rules. Since we want to keep them (of course), put those in cfg.mk.
* Makefile.maint: Merge from gnulib's maint.mk.
* cfg.mk (sc_avoid_write): New rule. From Makefile.cfg.
(sc_prohibit_strcmp_and_strncmp): Likewise, and rename.
(sc_prohibit_asprintf, sc_prohibit_VIR_ERR_NO_MEMORY): Likewise.
(sc_prohibit_nonreentrant): Likewise.
(sc_prohibit_ctype_h): Likewise.
(sc_TAB_in_indentation, sc_avoid_ctype_macros): Likewise.
(sc_prohibit_virBufferAdd_with_string_literal): Likewise.
(sc_prohibit_gethostby): Likewise.
(sc_libvirt_unmarked_diagnostics): Likewise. Also, rename the
rule, inserting "_libvirt", since this rule is a specialization of
the one in gnulib.
* GNUmakefile: Include cfg.mk, not Makefile.cfg
* .x-sc_prohibit_strcmp_and_strncmp: New file.
* Makefile.am (EXTRA_DIST): Add .x-sc_prohibit_strcmp_and_strncmp
2009-07-06 16:28:10 +00:00
|
|
|
sc_prohibit_virBufferAdd_with_string_literal:
|
2017-11-03 12:09:47 +00:00
|
|
|
@prohibit='\<virBufferAdd *\([^,]+, *"[^"]' \
|
build: import latest gnulib
A lot of syntax check rules have to be rewritten, but the
result is easier to maintain. I tested each syntax rule
by intentionally introducing a temporary violation of the rule.
Additionally, some false positives for unmarked_diagnostics
crept in, and an improved copyright_format test caught some bugs.
* .gnulib: Update to latest.
* cfg.mk (sc_prohibit_test_minus_ao): Delete, it was moved into
gnulib's maint.mk.
(sc_avoid_write, sc_prohibit_strcmp_and_strncmp)
(sc_prohibit_asprintf, sc_prohibit_strncpy, sc_prohibit_readlink)
(sc_prohibit_gethostname, sc_prohibit_gettext_noop)
(sc_prohibit_VIR_ERR_NO_MEMORY, sc_prohibit_nonreentrant)
(sc_prohibit_ctype_h, sc_TAB_in_indentation)
(sc_avoid_ctype_macros)
(sc_prohibit_virBufferAdd_with_string_literal)
(sc_prohibit_gethostby, sc_copyright_format): Rewrite in terms of
new maint.mk macros.
(sc_libvirt_unmarked_diagnostics): Fix whitespace.
* .x-sc_unmarked_diagnostics: New file.
* tests/object-locking.ml: Fix copyright.
* tools/virt-pki-validate.in: Likewise.
* tools/virt-xml-validate.in: Likewise.
2010-03-31 23:02:10 +00:00
|
|
|
halt='use virBufferAddLit, not virBufferAdd, with a string literal' \
|
|
|
|
$(_sc_search_regexp)
|
Prepare to use maint.mk from gnulib
Since Makefile.maint will soon come from gnulib's maint.mk,
sync Makefile.maint to have the same contents (modulo minor
things). In syncing it, we have to remove some libvirt-specific
rules. Since we want to keep them (of course), put those in cfg.mk.
* Makefile.maint: Merge from gnulib's maint.mk.
* cfg.mk (sc_avoid_write): New rule. From Makefile.cfg.
(sc_prohibit_strcmp_and_strncmp): Likewise, and rename.
(sc_prohibit_asprintf, sc_prohibit_VIR_ERR_NO_MEMORY): Likewise.
(sc_prohibit_nonreentrant): Likewise.
(sc_prohibit_ctype_h): Likewise.
(sc_TAB_in_indentation, sc_avoid_ctype_macros): Likewise.
(sc_prohibit_virBufferAdd_with_string_literal): Likewise.
(sc_prohibit_gethostby): Likewise.
(sc_libvirt_unmarked_diagnostics): Likewise. Also, rename the
rule, inserting "_libvirt", since this rule is a specialization of
the one in gnulib.
* GNUmakefile: Include cfg.mk, not Makefile.cfg
* .x-sc_prohibit_strcmp_and_strncmp: New file.
* Makefile.am (EXTRA_DIST): Add .x-sc_prohibit_strcmp_and_strncmp
2009-07-06 16:28:10 +00:00
|
|
|
|
2013-05-07 11:42:40 +00:00
|
|
|
sc_prohibit_virBufferAsprintf_with_string_literal:
|
2017-11-03 12:09:47 +00:00
|
|
|
@prohibit='\<virBufferAsprintf *\([^,]+, *"([^%"\]|\\.|%%)*"\)' \
|
2013-05-07 11:42:40 +00:00
|
|
|
halt='use virBufferAddLit, not virBufferAsprintf, with a string literal' \
|
|
|
|
$(_sc_search_regexp)
|
|
|
|
|
2014-03-13 00:05:31 +00:00
|
|
|
sc_forbid_manual_xml_indent:
|
2017-11-03 12:09:47 +00:00
|
|
|
@prohibit='virBuffer.*" +<' \
|
2014-03-13 00:05:31 +00:00
|
|
|
halt='use virBufferAdjustIndent instead of spaces when indenting xml' \
|
|
|
|
$(_sc_search_regexp)
|
|
|
|
|
2013-04-25 20:24:42 +00:00
|
|
|
# dirname and basename from <libgen.h> are not required to be thread-safe
|
|
|
|
sc_prohibit_libgen:
|
2017-11-03 12:09:47 +00:00
|
|
|
@prohibit='( (base|dir)name *\(|include .libgen\.h)' \
|
2019-12-23 15:37:45 +00:00
|
|
|
halt='use functions from GLib, not <libgen.h>' \
|
2013-04-25 20:24:42 +00:00
|
|
|
$(_sc_search_regexp)
|
|
|
|
|
2010-11-24 20:08:55 +00:00
|
|
|
# raw xmlGetProp requires some nasty casts
|
|
|
|
sc_prohibit_xmlGetProp:
|
2017-11-03 12:09:47 +00:00
|
|
|
@prohibit='\<xmlGetProp *\(' \
|
|
|
|
halt='use virXMLPropString, not xmlGetProp' \
|
2010-11-24 20:08:55 +00:00
|
|
|
$(_sc_search_regexp)
|
|
|
|
|
2012-02-24 18:48:55 +00:00
|
|
|
# xml(ParseURI|SaveUri) doesn't handle IPv6 URIs well
|
|
|
|
sc_prohibit_xmlURI:
|
2017-11-03 12:09:47 +00:00
|
|
|
@prohibit='\<xml(ParseURI|SaveUri) *\(' \
|
|
|
|
halt='use virURI(Parse|Format), not xml(ParseURI|SaveUri)' \
|
2012-02-24 18:48:55 +00:00
|
|
|
$(_sc_search_regexp)
|
|
|
|
|
2012-03-23 07:34:09 +00:00
|
|
|
# we don't want old old-style return with parentheses around argument
|
|
|
|
sc_prohibit_return_as_function:
|
2017-11-03 12:09:47 +00:00
|
|
|
@prohibit='\<return *\(([^()]*(\([^()]*\)[^()]*)*)\) *;' \
|
|
|
|
halt='avoid extra () with return statements' \
|
2012-03-23 07:34:09 +00:00
|
|
|
$(_sc_search_regexp)
|
|
|
|
|
2019-10-14 13:02:40 +00:00
|
|
|
# G_GNUC_UNUSED should only be applied in implementations, not
|
2011-07-08 21:58:28 +00:00
|
|
|
# header declarations
|
2019-10-14 13:02:40 +00:00
|
|
|
sc_avoid_g_gnuc_unused_in_header:
|
|
|
|
@prohibit='^[^#]*G_GNUC_UNUSED([^:]|$$)' \
|
2017-11-03 12:09:47 +00:00
|
|
|
in_vc_files='\.h$$' \
|
2019-10-14 13:02:40 +00:00
|
|
|
halt='use G_GNUC_UNUSED in .c rather than .h files' \
|
2011-07-08 21:58:28 +00:00
|
|
|
$(_sc_search_regexp)
|
|
|
|
|
2019-10-14 15:46:42 +00:00
|
|
|
sc_prohibit_attribute_macros:
|
2019-10-15 11:38:21 +00:00
|
|
|
@prohibit='ATTRIBUTE_(UNUSED|NORETURN|SENTINEL|RETURN_CHECK|NOINLINE|FMT_PRINTF|FALLTHROUGH)' \
|
2019-10-14 15:46:42 +00:00
|
|
|
in_vc_files='\.[ch]$$' \
|
2019-10-15 11:13:39 +00:00
|
|
|
halt='use GLib macros: G_GNUC_<ATTRIBUTE_SUFFIX> for most' \
|
2019-10-14 15:46:42 +00:00
|
|
|
$(_sc_search_regexp)
|
|
|
|
|
2019-10-15 11:55:26 +00:00
|
|
|
sc_prohibit_non_glib_macros:
|
|
|
|
@prohibit='ARRAY_CARDINALITY' \
|
|
|
|
in_vc_files='\.[ch]$$' \
|
|
|
|
halt='use GLib macros: G_N_ELEMENTS' \
|
|
|
|
$(_sc_search_regexp)
|
|
|
|
|
2015-04-14 11:37:41 +00:00
|
|
|
sc_prohibit_int_index:
|
2017-11-03 12:09:47 +00:00
|
|
|
@prohibit='\<(int|unsigned)\s*\*?index\>(\s|,|;)' \
|
|
|
|
halt='use different name than 'index' for declaration' \
|
2015-04-14 11:37:41 +00:00
|
|
|
$(_sc_search_regexp)
|
|
|
|
|
2013-07-08 14:17:29 +00:00
|
|
|
sc_prohibit_int_ijk:
|
2017-11-03 12:09:47 +00:00
|
|
|
@prohibit='\<(int|unsigned) ([^(=]* )*(i|j|k)\>(\s|,|;)' \
|
|
|
|
exclude='exempt from syntax-check' \
|
|
|
|
halt='use size_t, not int/unsigned int for loop vars i, j, k' \
|
2013-07-08 14:17:29 +00:00
|
|
|
$(_sc_search_regexp)
|
|
|
|
|
|
|
|
sc_prohibit_loop_iijjkk:
|
2017-11-03 12:09:47 +00:00
|
|
|
@prohibit='\<(int|unsigned) ([^=]+ )*(ii|jj|kk)\>(\s|,|;)' \
|
|
|
|
halt='use i, j, k for loop iterators, not ii, jj, kk' \
|
2013-07-08 14:17:29 +00:00
|
|
|
$(_sc_search_regexp)
|
|
|
|
|
2013-08-07 22:44:58 +00:00
|
|
|
# RHEL 5 gcc can't grok "for (int i..."
|
|
|
|
sc_prohibit_loop_var_decl:
|
2017-11-03 12:09:47 +00:00
|
|
|
@prohibit='\<for *\(\w+[ *]+\w+' \
|
|
|
|
in_vc_files='\.[ch]$$' \
|
|
|
|
halt='declare loop iterators outside the for statement' \
|
2013-08-07 22:44:58 +00:00
|
|
|
$(_sc_search_regexp)
|
2014-11-17 23:39:48 +00:00
|
|
|
|
|
|
|
# Use 'bool', not 'int', when assigning true or false
|
|
|
|
sc_prohibit_int_assign_bool:
|
2017-11-03 12:09:47 +00:00
|
|
|
@prohibit='\<int\>.*= *(true|false)' \
|
|
|
|
halt='use bool type for boolean values' \
|
2014-11-17 23:39:48 +00:00
|
|
|
$(_sc_search_regexp)
|
2013-07-08 14:17:29 +00:00
|
|
|
|
2016-10-06 14:54:41 +00:00
|
|
|
sc_prohibit_unsigned_pid:
|
2017-11-03 12:09:47 +00:00
|
|
|
@prohibit='\<unsigned\> [^,=;(]+pid' \
|
|
|
|
halt='use signed type for pid values' \
|
2016-10-06 14:54:41 +00:00
|
|
|
$(_sc_search_regexp)
|
|
|
|
|
Prepare to use maint.mk from gnulib
Since Makefile.maint will soon come from gnulib's maint.mk,
sync Makefile.maint to have the same contents (modulo minor
things). In syncing it, we have to remove some libvirt-specific
rules. Since we want to keep them (of course), put those in cfg.mk.
* Makefile.maint: Merge from gnulib's maint.mk.
* cfg.mk (sc_avoid_write): New rule. From Makefile.cfg.
(sc_prohibit_strcmp_and_strncmp): Likewise, and rename.
(sc_prohibit_asprintf, sc_prohibit_VIR_ERR_NO_MEMORY): Likewise.
(sc_prohibit_nonreentrant): Likewise.
(sc_prohibit_ctype_h): Likewise.
(sc_TAB_in_indentation, sc_avoid_ctype_macros): Likewise.
(sc_prohibit_virBufferAdd_with_string_literal): Likewise.
(sc_prohibit_gethostby): Likewise.
(sc_libvirt_unmarked_diagnostics): Likewise. Also, rename the
rule, inserting "_libvirt", since this rule is a specialization of
the one in gnulib.
* GNUmakefile: Include cfg.mk, not Makefile.cfg
* .x-sc_prohibit_strcmp_and_strncmp: New file.
* Makefile.am (EXTRA_DIST): Add .x-sc_prohibit_strcmp_and_strncmp
2009-07-06 16:28:10 +00:00
|
|
|
# Many of the function names below came from this filter:
|
|
|
|
# git grep -B2 '\<_('|grep -E '\.c- *[[:alpha:]_][[:alnum:]_]* ?\(.*[,;]$' \
|
|
|
|
# |sed 's/.*\.c- *//'|perl -pe 's/ ?\(.*//'|sort -u \
|
|
|
|
# |grep -vE '^(qsort|if|close|assert|fputc|free|N_|vir.*GetName|.*Unlock|virNodeListDevices|virHashRemoveEntry|freeaddrinfo|.*[fF]ree|xdrmem_create|xmlXPathFreeObject|virUUIDFormat|openvzSetProgramSentinal|polkit_action_unref)$'
|
|
|
|
|
|
|
|
msg_gen_function =
|
2011-04-17 06:30:49 +00:00
|
|
|
msg_gen_function += VIR_ERROR
|
Prepare to use maint.mk from gnulib
Since Makefile.maint will soon come from gnulib's maint.mk,
sync Makefile.maint to have the same contents (modulo minor
things). In syncing it, we have to remove some libvirt-specific
rules. Since we want to keep them (of course), put those in cfg.mk.
* Makefile.maint: Merge from gnulib's maint.mk.
* cfg.mk (sc_avoid_write): New rule. From Makefile.cfg.
(sc_prohibit_strcmp_and_strncmp): Likewise, and rename.
(sc_prohibit_asprintf, sc_prohibit_VIR_ERR_NO_MEMORY): Likewise.
(sc_prohibit_nonreentrant): Likewise.
(sc_prohibit_ctype_h): Likewise.
(sc_TAB_in_indentation, sc_avoid_ctype_macros): Likewise.
(sc_prohibit_virBufferAdd_with_string_literal): Likewise.
(sc_prohibit_gethostby): Likewise.
(sc_libvirt_unmarked_diagnostics): Likewise. Also, rename the
rule, inserting "_libvirt", since this rule is a specialization of
the one in gnulib.
* GNUmakefile: Include cfg.mk, not Makefile.cfg
* .x-sc_prohibit_strcmp_and_strncmp: New file.
* Makefile.am (EXTRA_DIST): Add .x-sc_prohibit_strcmp_and_strncmp
2009-07-06 16:28:10 +00:00
|
|
|
msg_gen_function += lxcError
|
|
|
|
msg_gen_function += regerror
|
2010-05-12 17:23:06 +00:00
|
|
|
msg_gen_function += vah_error
|
|
|
|
msg_gen_function += vah_warning
|
2011-04-17 06:30:49 +00:00
|
|
|
msg_gen_function += virGenericReportError
|
Prepare to use maint.mk from gnulib
Since Makefile.maint will soon come from gnulib's maint.mk,
sync Makefile.maint to have the same contents (modulo minor
things). In syncing it, we have to remove some libvirt-specific
rules. Since we want to keep them (of course), put those in cfg.mk.
* Makefile.maint: Merge from gnulib's maint.mk.
* cfg.mk (sc_avoid_write): New rule. From Makefile.cfg.
(sc_prohibit_strcmp_and_strncmp): Likewise, and rename.
(sc_prohibit_asprintf, sc_prohibit_VIR_ERR_NO_MEMORY): Likewise.
(sc_prohibit_nonreentrant): Likewise.
(sc_prohibit_ctype_h): Likewise.
(sc_TAB_in_indentation, sc_avoid_ctype_macros): Likewise.
(sc_prohibit_virBufferAdd_with_string_literal): Likewise.
(sc_prohibit_gethostby): Likewise.
(sc_libvirt_unmarked_diagnostics): Likewise. Also, rename the
rule, inserting "_libvirt", since this rule is a specialization of
the one in gnulib.
* GNUmakefile: Include cfg.mk, not Makefile.cfg
* .x-sc_prohibit_strcmp_and_strncmp: New file.
* Makefile.am (EXTRA_DIST): Add .x-sc_prohibit_strcmp_and_strncmp
2009-07-06 16:28:10 +00:00
|
|
|
msg_gen_function += virRaiseError
|
2012-07-18 10:23:56 +00:00
|
|
|
msg_gen_function += virReportError
|
Prepare to use maint.mk from gnulib
Since Makefile.maint will soon come from gnulib's maint.mk,
sync Makefile.maint to have the same contents (modulo minor
things). In syncing it, we have to remove some libvirt-specific
rules. Since we want to keep them (of course), put those in cfg.mk.
* Makefile.maint: Merge from gnulib's maint.mk.
* cfg.mk (sc_avoid_write): New rule. From Makefile.cfg.
(sc_prohibit_strcmp_and_strncmp): Likewise, and rename.
(sc_prohibit_asprintf, sc_prohibit_VIR_ERR_NO_MEMORY): Likewise.
(sc_prohibit_nonreentrant): Likewise.
(sc_prohibit_ctype_h): Likewise.
(sc_TAB_in_indentation, sc_avoid_ctype_macros): Likewise.
(sc_prohibit_virBufferAdd_with_string_literal): Likewise.
(sc_prohibit_gethostby): Likewise.
(sc_libvirt_unmarked_diagnostics): Likewise. Also, rename the
rule, inserting "_libvirt", since this rule is a specialization of
the one in gnulib.
* GNUmakefile: Include cfg.mk, not Makefile.cfg
* .x-sc_prohibit_strcmp_and_strncmp: New file.
* Makefile.am (EXTRA_DIST): Add .x-sc_prohibit_strcmp_and_strncmp
2009-07-06 16:28:10 +00:00
|
|
|
msg_gen_function += virReportErrorHelper
|
|
|
|
msg_gen_function += virReportSystemError
|
2019-06-11 09:23:48 +00:00
|
|
|
msg_gen_function += virLastErrorPrefixMessage
|
Prepare to use maint.mk from gnulib
Since Makefile.maint will soon come from gnulib's maint.mk,
sync Makefile.maint to have the same contents (modulo minor
things). In syncing it, we have to remove some libvirt-specific
rules. Since we want to keep them (of course), put those in cfg.mk.
* Makefile.maint: Merge from gnulib's maint.mk.
* cfg.mk (sc_avoid_write): New rule. From Makefile.cfg.
(sc_prohibit_strcmp_and_strncmp): Likewise, and rename.
(sc_prohibit_asprintf, sc_prohibit_VIR_ERR_NO_MEMORY): Likewise.
(sc_prohibit_nonreentrant): Likewise.
(sc_prohibit_ctype_h): Likewise.
(sc_TAB_in_indentation, sc_avoid_ctype_macros): Likewise.
(sc_prohibit_virBufferAdd_with_string_literal): Likewise.
(sc_prohibit_gethostby): Likewise.
(sc_libvirt_unmarked_diagnostics): Likewise. Also, rename the
rule, inserting "_libvirt", since this rule is a specialization of
the one in gnulib.
* GNUmakefile: Include cfg.mk, not Makefile.cfg
* .x-sc_prohibit_strcmp_and_strncmp: New file.
* Makefile.am (EXTRA_DIST): Add .x-sc_prohibit_strcmp_and_strncmp
2009-07-06 16:28:10 +00:00
|
|
|
|
|
|
|
# Uncomment the following and run "make syntax-check" to see diagnostics
|
|
|
|
# that are not yet marked for translation, but that need to be rewritten
|
|
|
|
# so that they are translatable.
|
|
|
|
# msg_gen_function += fprintf
|
|
|
|
# msg_gen_function += testError
|
|
|
|
# msg_gen_function += vshPrint
|
|
|
|
# msg_gen_function += vshError
|
|
|
|
|
2016-06-16 10:05:35 +00:00
|
|
|
space =
|
|
|
|
space +=
|
|
|
|
func_re= ($(subst $(space),|,$(msg_gen_function)))
|
Prepare to use maint.mk from gnulib
Since Makefile.maint will soon come from gnulib's maint.mk,
sync Makefile.maint to have the same contents (modulo minor
things). In syncing it, we have to remove some libvirt-specific
rules. Since we want to keep them (of course), put those in cfg.mk.
* Makefile.maint: Merge from gnulib's maint.mk.
* cfg.mk (sc_avoid_write): New rule. From Makefile.cfg.
(sc_prohibit_strcmp_and_strncmp): Likewise, and rename.
(sc_prohibit_asprintf, sc_prohibit_VIR_ERR_NO_MEMORY): Likewise.
(sc_prohibit_nonreentrant): Likewise.
(sc_prohibit_ctype_h): Likewise.
(sc_TAB_in_indentation, sc_avoid_ctype_macros): Likewise.
(sc_prohibit_virBufferAdd_with_string_literal): Likewise.
(sc_prohibit_gethostby): Likewise.
(sc_libvirt_unmarked_diagnostics): Likewise. Also, rename the
rule, inserting "_libvirt", since this rule is a specialization of
the one in gnulib.
* GNUmakefile: Include cfg.mk, not Makefile.cfg
* .x-sc_prohibit_strcmp_and_strncmp: New file.
* Makefile.am (EXTRA_DIST): Add .x-sc_prohibit_strcmp_and_strncmp
2009-07-06 16:28:10 +00:00
|
|
|
|
|
|
|
# Look for diagnostics that aren't marked for translation.
|
|
|
|
# This won't find any for which error's format string is on a separate line.
|
|
|
|
# The sed filters eliminate false-positives like these:
|
|
|
|
# _("...: "
|
|
|
|
# "%s", _("no storage vol w..."
|
|
|
|
sc_libvirt_unmarked_diagnostics:
|
2017-11-03 12:09:47 +00:00
|
|
|
@prohibit='\<$(func_re) *\([^"]*"[^"]*[a-z]{3}' \
|
|
|
|
exclude='_\(' \
|
|
|
|
halt='found unmarked diagnostic(s)' \
|
2012-03-02 00:21:08 +00:00
|
|
|
$(_sc_search_regexp)
|
2019-01-03 19:30:39 +00:00
|
|
|
@{ $(VC_LIST_EXCEPT) | xargs \
|
|
|
|
$(GREP) -nE '\<$(func_re) *\(.*;$$' /dev/null; \
|
|
|
|
$(VC_LIST_EXCEPT) | xargs \
|
|
|
|
$(GREP) -A1 -nE '\<$(func_re) *\(.*,$$' /dev/null; } \
|
2019-01-08 14:24:36 +00:00
|
|
|
| $(SED) -E 's/_\("([^\"]|\\.)+"//;s/"%s"//' \
|
|
|
|
| $(GREP) '"' && \
|
2017-11-03 12:09:47 +00:00
|
|
|
{ echo '$(ME): found unmarked diagnostic(s)' 1>&2; \
|
Prepare to use maint.mk from gnulib
Since Makefile.maint will soon come from gnulib's maint.mk,
sync Makefile.maint to have the same contents (modulo minor
things). In syncing it, we have to remove some libvirt-specific
rules. Since we want to keep them (of course), put those in cfg.mk.
* Makefile.maint: Merge from gnulib's maint.mk.
* cfg.mk (sc_avoid_write): New rule. From Makefile.cfg.
(sc_prohibit_strcmp_and_strncmp): Likewise, and rename.
(sc_prohibit_asprintf, sc_prohibit_VIR_ERR_NO_MEMORY): Likewise.
(sc_prohibit_nonreentrant): Likewise.
(sc_prohibit_ctype_h): Likewise.
(sc_TAB_in_indentation, sc_avoid_ctype_macros): Likewise.
(sc_prohibit_virBufferAdd_with_string_literal): Likewise.
(sc_prohibit_gethostby): Likewise.
(sc_libvirt_unmarked_diagnostics): Likewise. Also, rename the
rule, inserting "_libvirt", since this rule is a specialization of
the one in gnulib.
* GNUmakefile: Include cfg.mk, not Makefile.cfg
* .x-sc_prohibit_strcmp_and_strncmp: New file.
* Makefile.am (EXTRA_DIST): Add .x-sc_prohibit_strcmp_and_strncmp
2009-07-06 16:28:10 +00:00
|
|
|
exit 1; } || :
|
2009-07-07 16:08:45 +00:00
|
|
|
|
2010-05-20 09:13:41 +00:00
|
|
|
# Like the above, but prohibit a newline at the end of a diagnostic.
|
|
|
|
# This is subject to false positives partly because it naively looks for
|
|
|
|
# `\n"', which may not be the end of the string, and also because it takes
|
|
|
|
# two lines of context (the -A2) after the line with the function name.
|
|
|
|
# FIXME: this rule might benefit from a separate function list, in case
|
|
|
|
# there are functions to which this one applies but that do not get marked
|
|
|
|
# diagnostics.
|
|
|
|
sc_prohibit_newline_at_end_of_diagnostic:
|
2019-01-03 19:30:39 +00:00
|
|
|
@$(VC_LIST_EXCEPT) | xargs $(GREP) -A2 -nE \
|
|
|
|
'\<$(func_re) *\(' /dev/null \
|
2019-01-03 15:31:37 +00:00
|
|
|
| $(GREP) '\\n"' \
|
2017-11-03 12:09:47 +00:00
|
|
|
&& { echo '$(ME): newline at end of message(s)' 1>&2; \
|
2010-05-20 09:13:41 +00:00
|
|
|
exit 1; } || :
|
|
|
|
|
maint: don't permit format strings without %
Any time we have a string with no % passed through gettext, a
translator can inject a % to cause a stack overread. When there
is nothing to format, it's easier to ask for a string that cannot
be used as a formatter, by using a trivial "%s" format instead.
In the past, we have used --disable-nls to catch some of the
offenders, but that doesn't get run very often, and many more
uses have crept in. Syntax check to the rescue!
The syntax check can catch uses such as
virReportError(code,
_("split "
"string"));
by using a sed script to fold context lines into one pattern
space before checking for a string without %.
This patch is just mechanical insertion of %s; there are probably
several messages touched by this patch where we would be better
off giving the user more information than a fixed string.
* cfg.mk (sc_prohibit_diagnostic_without_format): New rule.
* src/datatypes.c (virUnrefConnect, virGetDomain)
(virUnrefDomain, virGetNetwork, virUnrefNetwork, virGetInterface)
(virUnrefInterface, virGetStoragePool, virUnrefStoragePool)
(virGetStorageVol, virUnrefStorageVol, virGetNodeDevice)
(virGetSecret, virUnrefSecret, virGetNWFilter, virUnrefNWFilter)
(virGetDomainSnapshot, virUnrefDomainSnapshot): Add %s wrapper.
* src/lxc/lxc_driver.c (lxcDomainSetBlkioParameters)
(lxcDomainGetBlkioParameters): Likewise.
* src/conf/domain_conf.c (virSecurityDeviceLabelDefParseXML)
(virDomainDiskDefParseXML, virDomainGraphicsDefParseXML):
Likewise.
* src/conf/network_conf.c (virNetworkDNSHostsDefParseXML)
(virNetworkDefParseXML): Likewise.
* src/conf/nwfilter_conf.c (virNWFilterIsValidChainName):
Likewise.
* src/conf/nwfilter_params.c (virNWFilterVarValueCreateSimple)
(virNWFilterVarAccessParse): Likewise.
* src/libvirt.c (virDomainSave, virDomainSaveFlags)
(virDomainRestore, virDomainRestoreFlags)
(virDomainSaveImageGetXMLDesc, virDomainSaveImageDefineXML)
(virDomainCoreDump, virDomainGetXMLDesc)
(virDomainMigrateVersion1, virDomainMigrateVersion2)
(virDomainMigrateVersion3, virDomainMigrate, virDomainMigrate2)
(virStreamSendAll, virStreamRecvAll)
(virDomainSnapshotGetXMLDesc): Likewise.
* src/nwfilter/nwfilter_dhcpsnoop.c (virNWFilterSnoopReqLeaseDel)
(virNWFilterDHCPSnoopReq): Likewise.
* src/openvz/openvz_driver.c (openvzUpdateDevice): Likewise.
* src/openvz/openvz_util.c (openvzKBPerPages): Likewise.
* src/qemu/qemu_cgroup.c (qemuSetupCgroup): Likewise.
* src/qemu/qemu_command.c (qemuBuildHubDevStr, qemuBuildChrChardevStr)
(qemuBuildCommandLine): Likewise.
* src/qemu/qemu_driver.c (qemuDomainGetPercpuStats): Likewise.
* src/qemu/qemu_hotplug.c (qemuDomainAttachNetDevice): Likewise.
* src/rpc/virnetsaslcontext.c (virNetSASLSessionGetIdentity):
Likewise.
* src/rpc/virnetsocket.c (virNetSocketNewConnectUNIX)
(virNetSocketSendFD, virNetSocketRecvFD): Likewise.
* src/storage/storage_backend_disk.c
(virStorageBackendDiskBuildPool): Likewise.
* src/storage/storage_backend_fs.c
(virStorageBackendFileSystemProbe)
(virStorageBackendFileSystemBuild): Likewise.
* src/storage/storage_backend_rbd.c
(virStorageBackendRBDOpenRADOSConn): Likewise.
* src/storage/storage_driver.c (storageVolumeResize): Likewise.
* src/test/test_driver.c (testInterfaceChangeBegin)
(testInterfaceChangeCommit, testInterfaceChangeRollback):
Likewise.
* src/vbox/vbox_tmpl.c (vboxListAllDomains): Likewise.
* src/xenxs/xen_sxpr.c (xenFormatSxprDisk, xenFormatSxpr):
Likewise.
* src/xenxs/xen_xm.c (xenXMConfigGetUUID, xenFormatXMDisk)
(xenFormatXM): Likewise.
2012-07-23 20:33:08 +00:00
|
|
|
# Look for diagnostics that lack a % in the format string, except that we
|
|
|
|
# allow VIR_ERROR to do this, and ignore functions that take a single
|
|
|
|
# string rather than a format argument.
|
|
|
|
sc_prohibit_diagnostic_without_format:
|
2019-01-03 19:30:39 +00:00
|
|
|
@{ $(VC_LIST_EXCEPT) | xargs \
|
|
|
|
$(GREP) -nE '\<$(func_re) *\(.*;$$' /dev/null; \
|
|
|
|
$(VC_LIST_EXCEPT) | xargs \
|
|
|
|
$(GREP) -A2 -nE '\<$(func_re) *\(.*,$$' /dev/null; } \
|
2017-11-03 12:09:47 +00:00
|
|
|
| $(SED) -rn -e ':l; /[,"]$$/ {N;b l;}' \
|
2019-09-03 04:24:00 +00:00
|
|
|
-e '/(vah_(error|warning))/d' \
|
2017-11-03 12:09:47 +00:00
|
|
|
-e '/\<$(func_re) *\([^"]*"([^%"]|"\n[^"]*")*"[,)]/p' \
|
2019-01-03 15:31:37 +00:00
|
|
|
| $(GREP) -vE 'VIR_ERROR' && \
|
2017-11-03 12:09:47 +00:00
|
|
|
{ echo '$(ME): found diagnostic without %' 1>&2; \
|
maint: don't permit format strings without %
Any time we have a string with no % passed through gettext, a
translator can inject a % to cause a stack overread. When there
is nothing to format, it's easier to ask for a string that cannot
be used as a formatter, by using a trivial "%s" format instead.
In the past, we have used --disable-nls to catch some of the
offenders, but that doesn't get run very often, and many more
uses have crept in. Syntax check to the rescue!
The syntax check can catch uses such as
virReportError(code,
_("split "
"string"));
by using a sed script to fold context lines into one pattern
space before checking for a string without %.
This patch is just mechanical insertion of %s; there are probably
several messages touched by this patch where we would be better
off giving the user more information than a fixed string.
* cfg.mk (sc_prohibit_diagnostic_without_format): New rule.
* src/datatypes.c (virUnrefConnect, virGetDomain)
(virUnrefDomain, virGetNetwork, virUnrefNetwork, virGetInterface)
(virUnrefInterface, virGetStoragePool, virUnrefStoragePool)
(virGetStorageVol, virUnrefStorageVol, virGetNodeDevice)
(virGetSecret, virUnrefSecret, virGetNWFilter, virUnrefNWFilter)
(virGetDomainSnapshot, virUnrefDomainSnapshot): Add %s wrapper.
* src/lxc/lxc_driver.c (lxcDomainSetBlkioParameters)
(lxcDomainGetBlkioParameters): Likewise.
* src/conf/domain_conf.c (virSecurityDeviceLabelDefParseXML)
(virDomainDiskDefParseXML, virDomainGraphicsDefParseXML):
Likewise.
* src/conf/network_conf.c (virNetworkDNSHostsDefParseXML)
(virNetworkDefParseXML): Likewise.
* src/conf/nwfilter_conf.c (virNWFilterIsValidChainName):
Likewise.
* src/conf/nwfilter_params.c (virNWFilterVarValueCreateSimple)
(virNWFilterVarAccessParse): Likewise.
* src/libvirt.c (virDomainSave, virDomainSaveFlags)
(virDomainRestore, virDomainRestoreFlags)
(virDomainSaveImageGetXMLDesc, virDomainSaveImageDefineXML)
(virDomainCoreDump, virDomainGetXMLDesc)
(virDomainMigrateVersion1, virDomainMigrateVersion2)
(virDomainMigrateVersion3, virDomainMigrate, virDomainMigrate2)
(virStreamSendAll, virStreamRecvAll)
(virDomainSnapshotGetXMLDesc): Likewise.
* src/nwfilter/nwfilter_dhcpsnoop.c (virNWFilterSnoopReqLeaseDel)
(virNWFilterDHCPSnoopReq): Likewise.
* src/openvz/openvz_driver.c (openvzUpdateDevice): Likewise.
* src/openvz/openvz_util.c (openvzKBPerPages): Likewise.
* src/qemu/qemu_cgroup.c (qemuSetupCgroup): Likewise.
* src/qemu/qemu_command.c (qemuBuildHubDevStr, qemuBuildChrChardevStr)
(qemuBuildCommandLine): Likewise.
* src/qemu/qemu_driver.c (qemuDomainGetPercpuStats): Likewise.
* src/qemu/qemu_hotplug.c (qemuDomainAttachNetDevice): Likewise.
* src/rpc/virnetsaslcontext.c (virNetSASLSessionGetIdentity):
Likewise.
* src/rpc/virnetsocket.c (virNetSocketNewConnectUNIX)
(virNetSocketSendFD, virNetSocketRecvFD): Likewise.
* src/storage/storage_backend_disk.c
(virStorageBackendDiskBuildPool): Likewise.
* src/storage/storage_backend_fs.c
(virStorageBackendFileSystemProbe)
(virStorageBackendFileSystemBuild): Likewise.
* src/storage/storage_backend_rbd.c
(virStorageBackendRBDOpenRADOSConn): Likewise.
* src/storage/storage_driver.c (storageVolumeResize): Likewise.
* src/test/test_driver.c (testInterfaceChangeBegin)
(testInterfaceChangeCommit, testInterfaceChangeRollback):
Likewise.
* src/vbox/vbox_tmpl.c (vboxListAllDomains): Likewise.
* src/xenxs/xen_sxpr.c (xenFormatSxprDisk, xenFormatSxpr):
Likewise.
* src/xenxs/xen_xm.c (xenXMConfigGetUUID, xenFormatXMDisk)
(xenFormatXM): Likewise.
2012-07-23 20:33:08 +00:00
|
|
|
exit 1; } || :
|
|
|
|
|
2012-07-10 21:43:08 +00:00
|
|
|
# The strings "" and "%s" should never be marked for translation.
|
2012-08-20 14:26:58 +00:00
|
|
|
# Files under tests/ and examples/ should not be translated.
|
2012-07-10 21:43:08 +00:00
|
|
|
sc_prohibit_useless_translation:
|
2017-11-03 12:09:47 +00:00
|
|
|
@prohibit='_\("(%s)?"\)' \
|
|
|
|
halt='found useless translation' \
|
2012-08-20 14:26:58 +00:00
|
|
|
$(_sc_search_regexp)
|
2017-11-03 12:09:47 +00:00
|
|
|
@prohibit='\<N?_ *\(' \
|
|
|
|
in_vc_files='(tests|examples)/' \
|
|
|
|
halt='no translations in tests or examples' \
|
2012-07-10 21:43:08 +00:00
|
|
|
$(_sc_search_regexp)
|
|
|
|
|
2012-09-12 16:54:42 +00:00
|
|
|
# When splitting a diagnostic across lines, ensure that there is a space
|
|
|
|
# or \n on one side of the split.
|
|
|
|
sc_require_whitespace_in_translation:
|
2019-01-03 19:30:39 +00:00
|
|
|
@$(VC_LIST_EXCEPT) | xargs $(GREP) -n -A1 '"$$' /dev/null \
|
2017-11-03 12:09:47 +00:00
|
|
|
| $(SED) -ne ':l; /"$$/ {N;b l;}; s/"\n[^"]*"/""/g; s/\\n/ /g' \
|
2019-01-03 15:31:37 +00:00
|
|
|
-e '/_(.*[^\ ]""[^\ ]/p' | $(GREP) . && \
|
2017-11-03 12:09:47 +00:00
|
|
|
{ echo '$(ME): missing whitespace at line split' 1>&2; \
|
2012-09-12 16:54:42 +00:00
|
|
|
exit 1; } || :
|
|
|
|
|
2010-03-09 21:22:14 +00:00
|
|
|
# Enforce recommended preprocessor indentation style.
|
|
|
|
sc_preprocessor_indentation:
|
2017-11-03 12:09:47 +00:00
|
|
|
@if cppi --version >/dev/null 2>&1; then \
|
2019-01-03 15:31:37 +00:00
|
|
|
$(VC_LIST_EXCEPT) | $(GREP) -E '\.[ch](\.in)?$$' | xargs cppi -a -c \
|
2017-11-03 12:09:47 +00:00
|
|
|
|| { echo '$(ME): incorrect preprocessor indentation' 1>&2; \
|
|
|
|
exit 1; }; \
|
|
|
|
else \
|
|
|
|
echo '$(ME): skipping test $@: cppi not installed' 1>&2; \
|
2010-03-09 21:22:14 +00:00
|
|
|
fi
|
|
|
|
|
2013-01-09 20:50:03 +00:00
|
|
|
# Enforce similar spec file indentation style, by running cppi on a
|
|
|
|
# (comment-only) C file that mirrors the same layout as the spec file.
|
|
|
|
sc_spec_indentation:
|
2017-11-03 12:09:47 +00:00
|
|
|
@if cppi --version >/dev/null 2>&1; then \
|
2019-01-03 15:31:37 +00:00
|
|
|
for f in $$($(VC_LIST_EXCEPT) | $(GREP) '\.spec\.in$$'); do \
|
2017-11-03 12:09:47 +00:00
|
|
|
$(SED) -e 's|#|// #|; s|%ifn*\(arch\)* |#if a // |' \
|
|
|
|
-e 's/%\(else\|endif\|define\)/#\1/' \
|
|
|
|
-e 's/^\( *\)\1\1\1#/#\1/' \
|
|
|
|
-e 's|^\( *[^#/ ]\)|// \1|; s|^\( */[^/]\)|// \1|' $$f \
|
|
|
|
| cppi -a -c 2>&1 | $(SED) "s|standard input|$$f|"; \
|
2019-01-03 15:31:37 +00:00
|
|
|
done | { if $(GREP) . >&2; then false; else :; fi; } \
|
2017-11-03 12:09:47 +00:00
|
|
|
|| { echo '$(ME): incorrect preprocessor indentation' 1>&2; \
|
|
|
|
exit 1; }; \
|
|
|
|
else \
|
|
|
|
echo '$(ME): skipping test $@: cppi not installed' 1>&2; \
|
2013-01-09 20:50:03 +00:00
|
|
|
fi
|
|
|
|
|
2013-09-04 02:39:16 +00:00
|
|
|
# Nested conditionals are easier to understand if we enforce that endifs
|
|
|
|
# can be paired back to the if
|
|
|
|
sc_makefile_conditionals:
|
2017-11-03 12:09:47 +00:00
|
|
|
@prohibit='(else|endif)($$| *#)' \
|
|
|
|
in_vc_files='Makefile\.am' \
|
|
|
|
halt='match "if FOO" with "endif FOO" in Makefiles' \
|
2013-09-04 02:39:16 +00:00
|
|
|
$(_sc_search_regexp)
|
|
|
|
|
2013-07-17 17:47:01 +00:00
|
|
|
# Long lines can be harder to diff; too long, and git send-email chokes.
|
|
|
|
# For now, only enforce line length on files where we have intentionally
|
|
|
|
# fixed things and don't want to regress.
|
|
|
|
sc_prohibit_long_lines:
|
2017-11-03 12:09:47 +00:00
|
|
|
@prohibit='.{90}' \
|
|
|
|
in_vc_files='\.arg[sv]' \
|
|
|
|
halt='Wrap long lines in expected output files' \
|
2013-07-17 17:47:01 +00:00
|
|
|
$(_sc_search_regexp)
|
2017-11-03 12:09:47 +00:00
|
|
|
@prohibit='.{80}' \
|
2019-09-23 11:31:57 +00:00
|
|
|
in_vc_files='Makefile(\.inc)?\.am' \
|
2017-11-03 12:09:47 +00:00
|
|
|
halt='Wrap long lines in Makefiles' \
|
2013-07-18 15:37:52 +00:00
|
|
|
$(_sc_search_regexp)
|
2013-07-17 17:47:01 +00:00
|
|
|
|
2010-03-18 17:25:01 +00:00
|
|
|
sc_copyright_format:
|
2017-11-03 12:09:47 +00:00
|
|
|
@require='Copyright .*Red 'Hat', Inc\.' \
|
|
|
|
containing='Copyright .*Red 'Hat \
|
|
|
|
halt='Red Hat copyright is missing Inc.' \
|
2010-05-19 10:51:11 +00:00
|
|
|
$(_sc_search_regexp)
|
2017-11-03 12:09:47 +00:00
|
|
|
@prohibit='Copyright [^(].*Red 'Hat \
|
|
|
|
halt='consistently use (C) in Red Hat copyright' \
|
2010-05-19 10:51:11 +00:00
|
|
|
$(_sc_search_regexp)
|
2017-11-03 12:09:47 +00:00
|
|
|
@prohibit='\<RedHat\>' \
|
|
|
|
halt='spell Red Hat as two words' \
|
2011-07-19 18:17:22 +00:00
|
|
|
$(_sc_search_regexp)
|
2010-05-19 10:51:11 +00:00
|
|
|
|
2012-07-26 22:58:02 +00:00
|
|
|
# Prefer the new URL listing over the old street address listing when
|
2013-05-14 23:41:15 +00:00
|
|
|
# calling out where to get a copy of the [L]GPL. Also, while we have
|
|
|
|
# to ship COPYING (GPL) alongside COPYING.LESSER (LGPL), we want any
|
|
|
|
# source file that calls out a top-level file to call out the LGPL
|
|
|
|
# version. Note that our typical copyright boilerplate refers to the
|
|
|
|
# license by name, not by reference to a top-level file.
|
|
|
|
sc_copyright_usage:
|
2017-11-03 12:09:47 +00:00
|
|
|
@prohibit=Boston,' MA' \
|
|
|
|
halt='Point to <http://www.gnu.org/licenses/>, not an address' \
|
2012-07-26 22:58:02 +00:00
|
|
|
$(_sc_search_regexp)
|
2017-11-03 12:09:47 +00:00
|
|
|
@require='COPYING\.LESSER' \
|
|
|
|
containing='COPYING' \
|
|
|
|
halt='Refer to COPYING.LESSER for LGPL' \
|
2013-05-14 23:41:15 +00:00
|
|
|
$(_sc_search_regexp)
|
2017-11-03 12:09:47 +00:00
|
|
|
@prohibit='COPYING\.LIB' \
|
|
|
|
halt='Refer to COPYING.LESSER for LGPL' \
|
2013-05-14 23:41:15 +00:00
|
|
|
$(_sc_search_regexp)
|
2012-07-26 22:58:02 +00:00
|
|
|
|
2010-05-19 10:51:11 +00:00
|
|
|
# Some functions/macros produce messages intended solely for developers
|
|
|
|
# and maintainers. Do not mark them for translation.
|
|
|
|
sc_prohibit_gettext_markup:
|
2017-11-03 12:09:47 +00:00
|
|
|
@prohibit='\<VIR_(WARN|INFO|DEBUG) *\(_\(' \
|
|
|
|
halt='do not mark these strings for translation' \
|
2010-05-19 10:51:11 +00:00
|
|
|
$(_sc_search_regexp)
|
2010-03-18 17:25:01 +00:00
|
|
|
|
2012-03-02 00:21:08 +00:00
|
|
|
# Our code is divided into modular subdirectories for a reason, and
|
|
|
|
# lower-level code must not include higher-level headers.
|
|
|
|
cross_dirs=$(patsubst $(srcdir)/src/%.,%,$(wildcard $(srcdir)/src/*/.))
|
|
|
|
cross_dirs_re=($(subst / ,/|,$(cross_dirs)))
|
2018-01-25 10:53:54 +00:00
|
|
|
mid_dirs=access|admin|conf|cpu|locking|logging|rpc|security
|
2012-03-02 00:21:08 +00:00
|
|
|
sc_prohibit_cross_inclusion:
|
2017-11-03 12:09:47 +00:00
|
|
|
@for dir in $(cross_dirs); do \
|
|
|
|
case $$dir in \
|
|
|
|
util/) safe="util";; \
|
|
|
|
access/ | conf/) safe="($$dir|conf|util)";; \
|
2018-10-02 13:08:28 +00:00
|
|
|
cpu/| network/| node_device/| rpc/| security/| storage/) \
|
2017-11-03 12:09:47 +00:00
|
|
|
safe="($$dir|util|conf|storage)";; \
|
|
|
|
*) safe="($$dir|$(mid_dirs)|util)";; \
|
|
|
|
esac; \
|
|
|
|
in_vc_files="^src/$$dir" \
|
|
|
|
prohibit='^# *include .$(cross_dirs_re)' \
|
|
|
|
exclude="# *include .$$safe" \
|
|
|
|
halt='unsafe cross-directory include' \
|
|
|
|
$(_sc_search_regexp) \
|
2012-03-02 00:21:08 +00:00
|
|
|
done
|
|
|
|
|
2012-01-20 21:00:58 +00:00
|
|
|
# When converting an enum to a string, make sure that we track any new
|
|
|
|
# elements added to the enum by using a _LAST marker.
|
|
|
|
sc_require_enum_last_marker:
|
2019-01-03 19:30:39 +00:00
|
|
|
@$(VC_LIST_EXCEPT) | xargs \
|
|
|
|
$(GREP) -A1 -nE '^[^#]*VIR_ENUM_IMPL *\(' /dev/null \
|
2019-04-07 23:04:08 +00:00
|
|
|
| $(SED) -ne '/VIR_ENUM_IMPL.*,$$/N' \
|
|
|
|
-e '/VIR_ENUM_IMPL[^,]*,[^,]*,[^,]*[^_,][^L,][^A,][^S,][^T,],/p' \
|
2017-11-03 12:09:47 +00:00
|
|
|
-e '/VIR_ENUM_IMPL[^,]*,[^,]\{0,4\},/p' \
|
2019-01-03 15:31:37 +00:00
|
|
|
| $(GREP) . && \
|
2019-04-07 23:04:08 +00:00
|
|
|
{ echo '$(ME): enum impl needs _LAST marker on second line' 1>&2; \
|
2012-01-20 21:00:58 +00:00
|
|
|
exit 1; } || :
|
|
|
|
|
2019-10-08 09:38:29 +00:00
|
|
|
# We're intentionally ignoring a few warnings
|
|
|
|
#
|
|
|
|
# E501: Force breaking lines at < 80 characters results in
|
|
|
|
# some really unnatural code formatting which harms
|
|
|
|
# readability.
|
|
|
|
#
|
|
|
|
# W504: Knuth code style requires the operators "or" and "and" etc
|
|
|
|
# to be at the start of line in a multi-line conditional.
|
|
|
|
# This the opposite to what is normal libvirt practice.
|
|
|
|
#
|
|
|
|
FLAKE8_IGNORE = E501,W504
|
2019-09-24 11:50:43 +00:00
|
|
|
|
2019-09-18 04:19:43 +00:00
|
|
|
sc_flake8:
|
|
|
|
@if [ -n "$(FLAKE8)" ]; then \
|
|
|
|
$(VC_LIST_EXCEPT) | $(GREP) '\.py$$' | xargs \
|
2019-09-24 11:50:43 +00:00
|
|
|
$(FLAKE8) --ignore $(FLAKE8_IGNORE) --show-source; \
|
2019-09-18 04:19:43 +00:00
|
|
|
else \
|
|
|
|
echo '$(ME): skipping test $@: flake8 not installed' 1>&2; \
|
|
|
|
fi
|
2013-02-07 07:01:52 +00:00
|
|
|
|
2013-02-22 22:42:39 +00:00
|
|
|
# mymain() in test files should use return, not exit, for nicer output
|
|
|
|
sc_prohibit_exit_in_tests:
|
2017-11-03 12:09:47 +00:00
|
|
|
@prohibit='\<exit *\(' \
|
|
|
|
in_vc_files='tests/.*\.c$$' \
|
|
|
|
halt='use return, not exit(), in tests' \
|
2013-02-22 22:42:39 +00:00
|
|
|
$(_sc_search_regexp)
|
|
|
|
|
2013-04-17 10:19:18 +00:00
|
|
|
# Don't include "libvirt/*.h" in "" form.
|
2013-04-17 10:19:19 +00:00
|
|
|
sc_prohibit_include_public_headers_quote:
|
2017-11-03 12:09:47 +00:00
|
|
|
@prohibit='# *include *"libvirt/.*\.h"' \
|
|
|
|
in_vc_files='\.[ch]$$' \
|
|
|
|
halt='Do not include libvirt/*.h in internal source' \
|
2013-04-17 10:19:19 +00:00
|
|
|
$(_sc_search_regexp)
|
|
|
|
|
|
|
|
# Don't include "libvirt/*.h" in <> form. Except for external tools,
|
|
|
|
# e.g. Python binding, examples and tools subdirectories.
|
|
|
|
sc_prohibit_include_public_headers_brackets:
|
2017-11-03 12:09:47 +00:00
|
|
|
@prohibit='# *include *<libvirt/.*\.h>' \
|
|
|
|
in_vc_files='\.[ch]$$' \
|
|
|
|
halt='Do not include libvirt/*.h in internal source' \
|
2013-04-17 10:19:18 +00:00
|
|
|
$(_sc_search_regexp)
|
|
|
|
|
2013-05-31 17:52:51 +00:00
|
|
|
# <config.h> is only needed in .c files; .h files do not need it since
|
|
|
|
# .c files must include config.h before any other .h.
|
|
|
|
sc_prohibit_config_h_in_headers:
|
2017-11-03 12:09:47 +00:00
|
|
|
@prohibit='^# *include\>.*config\.h' \
|
|
|
|
in_vc_files='\.h$$' \
|
|
|
|
halt='headers should not include <config.h>' \
|
2013-05-31 17:52:51 +00:00
|
|
|
$(_sc_search_regexp)
|
|
|
|
|
2013-08-19 14:17:20 +00:00
|
|
|
sc_prohibit_unbounded_arrays_in_rpc:
|
2017-11-03 12:09:47 +00:00
|
|
|
@prohibit='<>' \
|
|
|
|
in_vc_files='\.x$$' \
|
|
|
|
halt='Arrays in XDR must have a upper limit set for <NNN>' \
|
2013-08-19 14:17:20 +00:00
|
|
|
$(_sc_search_regexp)
|
|
|
|
|
2013-11-14 16:14:26 +00:00
|
|
|
sc_prohibit_atoi:
|
2017-11-03 12:09:47 +00:00
|
|
|
@prohibit='\bato(i|f|l|ll|q) *\(' \
|
2013-11-14 16:14:26 +00:00
|
|
|
halt='Use virStrToLong* instead of atoi, atol, atof, atoq, atoll' \
|
|
|
|
$(_sc_search_regexp)
|
|
|
|
|
2014-03-07 13:38:51 +00:00
|
|
|
sc_prohibit_wrong_filename_in_comment:
|
2019-01-03 19:30:39 +00:00
|
|
|
@$(VC_LIST_EXCEPT) | $(GREP) '\.[ch]$$' | xargs awk 'BEGIN { \
|
2017-11-03 12:09:47 +00:00
|
|
|
fail=0; \
|
|
|
|
} FNR < 3 { \
|
2014-03-07 13:38:51 +00:00
|
|
|
n=match($$0, /[[:space:]][^[:space:]]*[.][ch][[:space:]:]/); \
|
2017-11-03 12:09:47 +00:00
|
|
|
if (n > 0) { \
|
|
|
|
A=substr($$0, RSTART+1, RLENGTH-2); \
|
|
|
|
n=split(FILENAME, arr, "/"); \
|
|
|
|
if (A != arr[n]) { \
|
|
|
|
print "in " FILENAME ": " A " mentioned in comments "; \
|
|
|
|
fail=1; \
|
|
|
|
} \
|
|
|
|
} \
|
|
|
|
} END { \
|
|
|
|
if (fail == 1) { \
|
|
|
|
exit 1; \
|
|
|
|
} \
|
2019-01-03 19:30:39 +00:00
|
|
|
}' || { echo '$(ME): The file name in comments must match the' \
|
|
|
|
'actual file name' 1>&2; exit 1; }
|
2014-03-07 13:38:51 +00:00
|
|
|
|
2014-03-07 10:15:39 +00:00
|
|
|
sc_prohibit_virConnectOpen_in_virsh:
|
2017-11-03 12:09:47 +00:00
|
|
|
@prohibit='\bvirConnectOpen[a-zA-Z]* *\(' \
|
|
|
|
in_vc_files='tools/virsh-.*\.[ch]$$' \
|
|
|
|
halt='Use vshConnect() in virsh instead of virConnectOpen*' \
|
2014-03-07 10:15:39 +00:00
|
|
|
$(_sc_search_regexp)
|
|
|
|
|
2014-03-21 12:07:03 +00:00
|
|
|
sc_require_space_before_label:
|
2017-11-03 12:09:47 +00:00
|
|
|
@prohibit='^( ?)?[_a-zA-Z0-9]+:$$' \
|
|
|
|
in_vc_files='\.[ch]$$' \
|
|
|
|
halt='Top-level labels should be indented by one space' \
|
2014-03-21 12:07:03 +00:00
|
|
|
$(_sc_search_regexp)
|
|
|
|
|
2015-11-02 11:12:22 +00:00
|
|
|
# Allow for up to three spaces before the label: this is to avoid running
|
|
|
|
# into situations where neither this rule nor require_space_before_label
|
|
|
|
# would apply, eg. a line matching ^[a-zA-Z0-9]+ :$
|
|
|
|
sc_prohibit_space_in_label:
|
2017-11-03 12:09:47 +00:00
|
|
|
@prohibit='^ {0,3}[_a-zA-Z0-9]+ +:$$' \
|
|
|
|
in_vc_files='\.[ch]$$' \
|
|
|
|
halt='There should be no space between label name and colon' \
|
2015-11-02 11:12:22 +00:00
|
|
|
$(_sc_search_regexp)
|
|
|
|
|
2014-09-03 17:17:01 +00:00
|
|
|
# Doesn't catch all cases of mismatched braces across if-else, but it helps
|
|
|
|
sc_require_if_else_matching_braces:
|
2017-11-03 12:09:47 +00:00
|
|
|
@prohibit='( else( if .*\))? {|} else( if .*\))?$$)' \
|
|
|
|
in_vc_files='\.[chx]$$' \
|
|
|
|
halt='if one side of if-else uses {}, both sides must use it' \
|
2014-09-03 17:17:01 +00:00
|
|
|
$(_sc_search_regexp)
|
|
|
|
|
2013-09-20 15:56:38 +00:00
|
|
|
sc_curly_braces_style:
|
2019-01-03 19:30:39 +00:00
|
|
|
@if $(VC_LIST_EXCEPT) | $(GREP) '\.[ch]$$' | xargs $(GREP) -nHP \
|
2017-11-03 12:09:47 +00:00
|
|
|
'^\s*(?!([a-zA-Z_]*for_?each[a-zA-Z_]*) ?\()([_a-zA-Z0-9]+( [_a-zA-Z0-9]+)* ?\()?(\*?[_a-zA-Z0-9]+(,? \*?[_a-zA-Z0-9\[\]]+)+|void)\) ?\{' \
|
2019-01-03 19:30:39 +00:00
|
|
|
/dev/null; then \
|
2017-11-03 12:09:47 +00:00
|
|
|
echo '$(ME): Non-K&R style used for curly braces around' \
|
|
|
|
'function body' 1>&2; exit 1; \
|
|
|
|
fi; \
|
2019-01-03 19:30:39 +00:00
|
|
|
if $(VC_LIST_EXCEPT) | $(GREP) '\.[ch]$$' | xargs \
|
|
|
|
$(GREP) -A1 -En ' ((if|for|while|switch) \(|(else|do)\b)[^{]*$$' \
|
|
|
|
/dev/null | $(GREP) '^[^ ]*- *{'; then \
|
2017-06-26 06:45:44 +00:00
|
|
|
echo '$(ME): Use hanging braces for compound statements' 1>&2; exit 1; \
|
2014-09-03 22:18:19 +00:00
|
|
|
fi
|
2013-11-14 16:14:26 +00:00
|
|
|
|
2014-03-29 11:16:38 +00:00
|
|
|
sc_prohibit_windows_special_chars_in_filename:
|
2019-01-03 19:30:39 +00:00
|
|
|
@$(VC_LIST_EXCEPT) | $(GREP) '[:*?"<>|]' && \
|
|
|
|
{ echo '$(ME): Windows special chars in filename not allowed' 1>&2; echo exit 1; } || :
|
2014-03-29 11:16:38 +00:00
|
|
|
|
2014-03-13 12:00:16 +00:00
|
|
|
sc_prohibit_mixed_case_abbreviations:
|
2017-11-03 12:09:47 +00:00
|
|
|
@prohibit='Pci|Usb|Scsi' \
|
|
|
|
in_vc_files='\.[ch]$$' \
|
|
|
|
halt='Use PCI, USB, SCSI, not Pci, Usb, Scsi' \
|
2014-03-13 12:00:16 +00:00
|
|
|
$(_sc_search_regexp)
|
|
|
|
|
2014-06-04 08:57:21 +00:00
|
|
|
# Require #include <locale.h> in all files that call setlocale()
|
|
|
|
sc_require_locale_h:
|
2017-11-03 12:09:47 +00:00
|
|
|
@require='include.*locale\.h' \
|
|
|
|
containing='setlocale *(' \
|
|
|
|
halt='setlocale() requires <locale.h>' \
|
2014-06-04 17:07:59 +00:00
|
|
|
$(_sc_search_regexp)
|
2014-06-04 08:57:21 +00:00
|
|
|
|
2014-03-18 10:29:12 +00:00
|
|
|
sc_prohibit_empty_first_line:
|
2019-01-03 19:30:39 +00:00
|
|
|
@$(VC_LIST_EXCEPT) | xargs awk 'BEGIN { fail=0; } \
|
2017-11-03 12:09:47 +00:00
|
|
|
FNR == 1 { if ($$0 == "") { print FILENAME ":1:"; fail=1; } } \
|
|
|
|
END { if (fail == 1) { \
|
|
|
|
print "$(ME): Prohibited empty first line" > "/dev/stderr"; \
|
2019-01-03 19:30:39 +00:00
|
|
|
} exit fail; }'
|
2014-03-18 10:29:12 +00:00
|
|
|
|
2014-08-20 11:00:30 +00:00
|
|
|
sc_prohibit_paren_brace:
|
2017-11-03 12:09:47 +00:00
|
|
|
@prohibit='\)\{$$' \
|
|
|
|
in_vc_files='\.[chx]$$' \
|
|
|
|
halt='Put space between closing parenthesis and opening brace' \
|
2014-08-20 11:00:30 +00:00
|
|
|
$(_sc_search_regexp)
|
|
|
|
|
2014-10-28 18:22:03 +00:00
|
|
|
# C guarantees that static variables are zero initialized, and some compilers
|
|
|
|
# waste space by sticking explicit initializers in .data instead of .bss
|
|
|
|
sc_prohibit_static_zero_init:
|
2017-11-03 12:09:47 +00:00
|
|
|
@prohibit='\bstatic\b.*= *(0[^xX0-9]|NULL|false)' \
|
|
|
|
in_vc_files='\.[chx](\.in)?$$' \
|
2014-10-28 18:22:03 +00:00
|
|
|
halt='static variables do not need explicit zero initialization'\
|
|
|
|
$(_sc_search_regexp)
|
|
|
|
|
2014-10-01 14:07:46 +00:00
|
|
|
# FreeBSD exports the "devname" symbol which produces a warning.
|
|
|
|
sc_prohibit_devname:
|
2017-11-03 12:09:47 +00:00
|
|
|
@prohibit='\bdevname\b' \
|
2014-10-01 14:07:46 +00:00
|
|
|
exclude='sc_prohibit_devname' \
|
2016-04-11 14:45:53 +00:00
|
|
|
halt='avoid using devname as FreeBSD exports the symbol' \
|
2014-10-01 14:07:46 +00:00
|
|
|
$(_sc_search_regexp)
|
|
|
|
|
2014-11-28 08:37:42 +00:00
|
|
|
sc_prohibit_system_error_with_vir_err:
|
|
|
|
@prohibit='\bvirReportSystemError *\(VIR_ERR_' \
|
|
|
|
halt='do not use virReportSystemError with VIR_ERR_* error codes' \
|
|
|
|
$(_sc_search_regexp)
|
|
|
|
|
2014-11-30 14:57:02 +00:00
|
|
|
# Rule to prohibit usage of virXXXFree within library, daemon, remote, etc.
|
|
|
|
# functions. There's a corresponding exclude to allow usage within tests,
|
|
|
|
# docs, examples, tools, src/libvirt-*.c, and include/libvirt/libvirt-*.h
|
|
|
|
sc_prohibit_virXXXFree:
|
2017-11-03 12:09:47 +00:00
|
|
|
@prohibit='\bvir(Domain|Network|NodeDevice|StorageVol|StoragePool|Stream|Secret|NWFilter|Interface|DomainSnapshot)Free\b' \
|
2014-11-30 14:57:02 +00:00
|
|
|
exclude='sc_prohibit_virXXXFree' \
|
2016-04-11 14:45:53 +00:00
|
|
|
halt='avoid using virXXXFree, use virObjectUnref instead' \
|
2014-11-30 14:57:02 +00:00
|
|
|
$(_sc_search_regexp)
|
|
|
|
|
2015-02-02 10:26:49 +00:00
|
|
|
sc_prohibit_sysconf_pagesize:
|
|
|
|
@prohibit='sysconf\(_SC_PAGESIZE' \
|
|
|
|
halt='use virGetSystemPageSize[KB] instead of sysconf(_SC_PAGESIZE)' \
|
|
|
|
$(_sc_search_regexp)
|
|
|
|
|
2017-02-13 13:36:53 +00:00
|
|
|
sc_prohibit_virSecurity:
|
2019-01-03 19:30:39 +00:00
|
|
|
@$(VC_LIST_EXCEPT) | $(GREP) 'src/qemu/' | \
|
|
|
|
$(GREP) -v 'src/qemu/qemu_security' | \
|
|
|
|
xargs $(GREP) -Pn 'virSecurityManager(?!Ptr)' /dev/null && \
|
2017-02-13 13:36:53 +00:00
|
|
|
{ echo '$(ME): prefer qemuSecurity wrappers' 1>&2; exit 1; } || :
|
|
|
|
|
2015-03-20 15:25:15 +00:00
|
|
|
sc_prohibit_pthread_create:
|
|
|
|
@prohibit='\bpthread_create\b' \
|
|
|
|
exclude='sc_prohibit_pthread_create' \
|
2016-04-11 14:45:53 +00:00
|
|
|
halt='avoid using pthread_create, use virThreadCreate instead' \
|
2015-03-20 15:25:15 +00:00
|
|
|
$(_sc_search_regexp)
|
|
|
|
|
2015-10-20 16:15:12 +00:00
|
|
|
sc_prohibit_not_streq:
|
2017-11-03 12:09:47 +00:00
|
|
|
@prohibit='! *STRN?EQ *\(.*\)' \
|
|
|
|
halt='Use STRNEQ instead of !STREQ and STREQ instead of !STRNEQ' \
|
2015-10-20 16:15:12 +00:00
|
|
|
$(_sc_search_regexp)
|
|
|
|
|
2016-02-03 08:48:40 +00:00
|
|
|
sc_prohibit_verbose_strcat:
|
2017-11-03 12:09:47 +00:00
|
|
|
@prohibit='strncat\([^,]*,\s+([^,]*),\s+strlen\(\1\)\)' \
|
|
|
|
in_vc_files='\.[ch]$$' \
|
2016-02-03 08:48:40 +00:00
|
|
|
halt='Use strcat(a, b) instead of strncat(a, b, strlen(b))' \
|
|
|
|
$(_sc_search_regexp)
|
|
|
|
|
2016-04-12 22:29:52 +00:00
|
|
|
# Ensure that each .c file containing a "main" function also
|
|
|
|
# calls virGettextInitialize
|
|
|
|
sc_gettext_init:
|
2017-11-03 12:09:47 +00:00
|
|
|
@require='virGettextInitialize *\(' \
|
|
|
|
in_vc_files='\.c$$' \
|
|
|
|
containing='\<main *(' \
|
|
|
|
halt='the above files do not call virGettextInitialize' \
|
2016-04-12 22:29:52 +00:00
|
|
|
$(_sc_search_regexp)
|
|
|
|
|
2017-04-11 10:16:52 +00:00
|
|
|
sc_prohibit_obj_free_apis_in_virsh:
|
2017-04-11 15:21:05 +00:00
|
|
|
@prohibit='\bvir(Domain|DomainSnapshot)Free\b' \
|
2017-11-03 12:09:47 +00:00
|
|
|
in_vc_files='virsh.*\.[ch]$$' \
|
2017-04-11 10:16:52 +00:00
|
|
|
exclude='sc_prohibit_obj_free_apis_in_virsh' \
|
2017-04-11 15:21:05 +00:00
|
|
|
halt='avoid using virDomain(Snapshot)Free in virsh, use virsh-prefixed wrappers instead' \
|
2017-04-11 10:16:52 +00:00
|
|
|
$(_sc_search_regexp)
|
|
|
|
|
2017-10-13 15:30:41 +00:00
|
|
|
https_sites = www.libvirt.org
|
|
|
|
https_sites += libvirt.org
|
|
|
|
https_sites += security.libvirt.org
|
|
|
|
https_sites += qemu.org
|
|
|
|
https_sites += www.qemu.org
|
|
|
|
https_sites += wiki.qemu.org
|
|
|
|
https_sites += linux-kvm.org
|
|
|
|
https_sites += www.linux-kvm.org
|
|
|
|
|
|
|
|
https_re= ($(subst $(space),|,$(https_sites)))
|
|
|
|
|
|
|
|
sc_prohibit_http_urls:
|
|
|
|
@prohibit='http://$(https_re)' \
|
|
|
|
exclude="/schemas/" \
|
|
|
|
halt='Links must use https:// protocol' \
|
|
|
|
$(_sc_search_regexp)
|
|
|
|
|
2018-12-13 11:23:42 +00:00
|
|
|
sc_prohibit_author:
|
|
|
|
@prohibit="(\*|#)\s*(A|a)uthors?:" \
|
|
|
|
halt="Author: statements are prohibited in source comments" \
|
|
|
|
$(_sc_search_regexp)
|
|
|
|
|
2017-12-04 10:12:06 +00:00
|
|
|
# Alignment is usually achieved through spaces (at least two of them)
|
|
|
|
# or tabs (at least one of them) right before the trailing backslash
|
2017-10-31 13:12:52 +00:00
|
|
|
sc_prohibit_backslash_alignment:
|
2017-12-04 10:12:06 +00:00
|
|
|
@prohibit='( | )\\$$' \
|
2017-10-31 13:12:52 +00:00
|
|
|
in_vc_files='*\.([chx]|am|mk)$$' \
|
|
|
|
halt='Do not attempt to right-align backslashes' \
|
|
|
|
$(_sc_search_regexp)
|
|
|
|
|
2018-07-13 17:54:40 +00:00
|
|
|
# Some syntax rules pertaining to the usage of cleanup macros
|
|
|
|
# implementing GNU C's cleanup attribute
|
|
|
|
|
2019-01-04 15:44:32 +00:00
|
|
|
# Rule to ensure that variables declared using a cleanup macro are
|
2018-07-13 17:54:40 +00:00
|
|
|
# always initialized.
|
|
|
|
sc_require_attribute_cleanup_initialization:
|
2019-10-01 09:52:28 +00:00
|
|
|
@prohibit='((g_auto(ptr|free)?)|(VIR_AUTO((FREE|PTR|UNREF|CLEAN)\(.+\)|CLOSE|STRINGLIST))) *[^=]+;' \
|
2018-07-13 17:54:40 +00:00
|
|
|
in_vc_files='\.[chx]$$' \
|
|
|
|
halt='variable declared with a cleanup macro must be initialized' \
|
|
|
|
$(_sc_search_regexp)
|
|
|
|
|
2019-03-12 08:08:00 +00:00
|
|
|
# "class" in headers is not good because by default Vim treats it as a keyword
|
|
|
|
# Let's prohibit it in source files as well.
|
|
|
|
sc_prohibit_class:
|
|
|
|
@prohibit=' +_?class *;' \
|
|
|
|
in_vc_files='\.[chx]$$' \
|
|
|
|
halt='use klass instead of class or _class' \
|
|
|
|
$(_sc_search_regexp)
|
|
|
|
|
2019-04-02 12:33:06 +00:00
|
|
|
# The dirent "d_type" field is non-portable and even when it
|
|
|
|
# exists some filesystems will only ever return DT_UNKNOWN.
|
|
|
|
# This field should only be used by code which is exclusively
|
|
|
|
# run platforms supporting "d_type" and must expect DT_UNKNOWN.
|
|
|
|
# We blacklist it to discourage accidental usage which has
|
|
|
|
# happened many times. Add an exclude rule if it is genuinely
|
|
|
|
# needed and the above restrictions are acceptable.
|
|
|
|
sc_prohibit_dirent_d_type:
|
|
|
|
@prohibit='(->|\.)d_type' \
|
|
|
|
in_vc_files='\.[chx]$$' \
|
|
|
|
halt='do not use the d_type field in "struct dirent"' \
|
|
|
|
$(_sc_search_regexp)
|
|
|
|
|
2019-03-12 08:08:00 +00:00
|
|
|
|
2019-10-02 16:51:19 +00:00
|
|
|
# _sc_search_regexp
|
|
|
|
#
|
|
|
|
# This macro searches for a given construct in the selected files and
|
|
|
|
# then takes some action.
|
|
|
|
#
|
|
|
|
# Parameters (shell variables):
|
|
|
|
#
|
|
|
|
# prohibit | require
|
|
|
|
#
|
|
|
|
# Regular expression (ERE) denoting either a forbidden construct
|
|
|
|
# or a required construct. Those arguments are exclusive.
|
|
|
|
#
|
|
|
|
# exclude
|
|
|
|
#
|
|
|
|
# Regular expression (ERE) denoting lines to ignore that matched
|
|
|
|
# a prohibit construct. For example, this can be used to exclude
|
|
|
|
# comments that mention why the nearby code uses an alternative
|
|
|
|
# construct instead of the simpler prohibited construct.
|
|
|
|
#
|
|
|
|
# in_vc_files | in_files
|
|
|
|
#
|
|
|
|
# grep-E-style regexp selecting the files to check. For in_vc_files,
|
|
|
|
# the regexp is used to select matching files from the list of all
|
|
|
|
# version-controlled files; for in_files, it's from the names printed
|
|
|
|
# by "find $(srcdir)". When neither is specified, use all files that
|
|
|
|
# are under version control.
|
|
|
|
#
|
|
|
|
# containing | non_containing
|
|
|
|
#
|
|
|
|
# Select the files (non) containing strings matching this regexp.
|
|
|
|
# If both arguments are specified then CONTAINING takes
|
|
|
|
# precedence.
|
|
|
|
#
|
|
|
|
# with_grep_options
|
|
|
|
#
|
|
|
|
# Extra options for grep.
|
|
|
|
#
|
|
|
|
# ignore_case
|
|
|
|
#
|
|
|
|
# Ignore case.
|
|
|
|
#
|
|
|
|
# halt
|
|
|
|
#
|
|
|
|
# Message to display before to halting execution.
|
|
|
|
#
|
|
|
|
# Finally, you may exempt files based on an ERE matching file names.
|
|
|
|
# For example, to exempt from the sc_space_tab check all files with the
|
|
|
|
# .diff suffix, set this Make variable:
|
|
|
|
#
|
|
|
|
# exclude_file_name_regexp--sc_space_tab = \.diff$
|
|
|
|
#
|
|
|
|
# Note that while this functionality is mostly inherited via VC_LIST_EXCEPT,
|
|
|
|
# when filtering by name via in_files, we explicitly filter out matching
|
|
|
|
# names here as well.
|
|
|
|
|
|
|
|
# Initialize each, so that envvar settings cannot interfere.
|
|
|
|
export require =
|
|
|
|
export prohibit =
|
|
|
|
export exclude =
|
|
|
|
export in_vc_files =
|
|
|
|
export in_files =
|
|
|
|
export containing =
|
|
|
|
export non_containing =
|
|
|
|
export halt =
|
|
|
|
export with_grep_options =
|
|
|
|
|
|
|
|
# By default, _sc_search_regexp does not ignore case.
|
|
|
|
export ignore_case =
|
|
|
|
_ignore_case = $$(test -n "$$ignore_case" && printf %s -i || :)
|
|
|
|
|
|
|
|
define _sc_say_and_exit
|
|
|
|
dummy=; : so we do not need a semicolon before each use; \
|
|
|
|
{ printf '%s\n' "$(ME): $$msg" 1>&2; exit 1; };
|
|
|
|
endef
|
|
|
|
|
|
|
|
define _sc_search_regexp
|
|
|
|
dummy=; : so we do not need a semicolon before each use; \
|
|
|
|
\
|
|
|
|
: Check arguments; \
|
|
|
|
test -n "$$prohibit" && test -n "$$require" \
|
|
|
|
&& { msg='Cannot specify both prohibit and require' \
|
|
|
|
$(_sc_say_and_exit) } || :; \
|
|
|
|
test -z "$$prohibit" && test -z "$$require" \
|
|
|
|
&& { msg='Should specify either prohibit or require' \
|
|
|
|
$(_sc_say_and_exit) } || :; \
|
|
|
|
test -z "$$prohibit" && test -n "$$exclude" \
|
|
|
|
&& { msg='Use of exclude requires a prohibit pattern' \
|
|
|
|
$(_sc_say_and_exit) } || :; \
|
|
|
|
test -n "$$in_vc_files" && test -n "$$in_files" \
|
|
|
|
&& { msg='Cannot specify both in_vc_files and in_files' \
|
|
|
|
$(_sc_say_and_exit) } || :; \
|
|
|
|
test "x$$halt" != x \
|
|
|
|
|| { msg='halt not defined' $(_sc_say_and_exit) }; \
|
|
|
|
\
|
|
|
|
: Filter by file name; \
|
|
|
|
if test -n "$$in_files"; then \
|
|
|
|
files=$$(find $(srcdir) | $(GREP) -E "$$in_files" \
|
|
|
|
| $(GREP) -Ev '$(_sc_excl)'); \
|
|
|
|
else \
|
|
|
|
files=$$($(VC_LIST_EXCEPT)); \
|
|
|
|
if test -n "$$in_vc_files"; then \
|
|
|
|
files=$$(echo "$$files" | $(GREP) -E "$$in_vc_files"); \
|
|
|
|
fi; \
|
|
|
|
fi; \
|
|
|
|
\
|
|
|
|
: Filter by content; \
|
|
|
|
test -n "$$files" \
|
|
|
|
&& test -n "$$containing" \
|
|
|
|
&& { files=$$(echo "$$files" | xargs $(GREP) -l "$$containing"); } \
|
|
|
|
|| :; \
|
|
|
|
test -n "$$files" \
|
|
|
|
&& test -n "$$non_containing" \
|
|
|
|
&& { files=$$(echo "$$files" | xargs $(GREP) -vl "$$non_containing"); } \
|
|
|
|
|| :; \
|
|
|
|
\
|
|
|
|
: Check for the construct; \
|
|
|
|
if test -n "$$files"; then \
|
|
|
|
if test -n "$$prohibit"; then \
|
|
|
|
echo "$$files" \
|
|
|
|
| xargs $(GREP) $$with_grep_options $(_ignore_case) -nE \
|
|
|
|
"$$prohibit" /dev/null \
|
|
|
|
| $(GREP) -vE "$${exclude:-^$$}" \
|
|
|
|
&& { msg="$$halt" $(_sc_say_and_exit) } \
|
|
|
|
|| :; \
|
|
|
|
else \
|
|
|
|
echo "$$files" \
|
|
|
|
| xargs \
|
|
|
|
$(GREP) $$with_grep_options $(_ignore_case) -LE "$$require" \
|
|
|
|
| $(GREP) . \
|
|
|
|
&& { msg="$$halt" $(_sc_say_and_exit) } \
|
|
|
|
|| :; \
|
|
|
|
fi \
|
|
|
|
else :; \
|
|
|
|
fi || :;
|
|
|
|
endef
|
|
|
|
|
|
|
|
sc_avoid_if_before_free:
|
|
|
|
@$(VC_LIST_EXCEPT) \
|
|
|
|
| $(GREP) -v useless-if-before-free \
|
|
|
|
| xargs \
|
|
|
|
$(srcdir)/$(_build-aux)/useless-if-before-free \
|
|
|
|
$(useless_free_options) \
|
|
|
|
&& { printf '$(ME): found useless "if"' \
|
|
|
|
' before "free" above\n' 1>&2; \
|
|
|
|
exit 1; } \
|
|
|
|
|| :
|
|
|
|
|
|
|
|
sc_cast_of_argument_to_free:
|
|
|
|
@prohibit='\<free *\( *\(' halt="don't cast free argument" \
|
|
|
|
$(_sc_search_regexp)
|
|
|
|
|
|
|
|
sc_cast_of_x_alloc_return_value:
|
|
|
|
@prohibit='\*\) *x(m|c|re)alloc\>' \
|
|
|
|
halt="don't cast x*alloc return value" \
|
|
|
|
$(_sc_search_regexp)
|
|
|
|
|
|
|
|
# Use STREQ rather than comparing strcmp == 0, or != 0.
|
|
|
|
sp_ = strcmp *\(.+\)
|
|
|
|
sc_prohibit_strcmp:
|
|
|
|
@prohibit='! *strcmp *\(|\<$(sp_) *[!=]=|[!=]= *$(sp_)' \
|
|
|
|
exclude='# *define STRN?EQ\(' \
|
|
|
|
halt='replace strcmp calls above with STREQ/STRNEQ' \
|
|
|
|
$(_sc_search_regexp)
|
|
|
|
|
|
|
|
# Really. You don't want to use this function.
|
|
|
|
# It may fail to NUL-terminate the destination,
|
|
|
|
# and always NUL-pads out to the specified length.
|
|
|
|
sc_prohibit_strncpy:
|
|
|
|
@prohibit='\<strncpy *\(' \
|
|
|
|
halt='do not use strncpy, period' \
|
|
|
|
$(_sc_search_regexp)
|
|
|
|
|
|
|
|
# Pass EXIT_*, not number, to usage, exit, and error (when exiting)
|
|
|
|
# Convert all uses automatically, via these two commands:
|
|
|
|
# git grep -l '\<exit *(1)' \
|
|
|
|
# | grep -vEf .x-sc_prohibit_magic_number_exit \
|
|
|
|
# | xargs --no-run-if-empty \
|
|
|
|
# perl -pi -e 's/(^|[^.])\b(exit ?)\(1\)/$1$2(EXIT_FAILURE)/'
|
|
|
|
# git grep -l '\<exit *(0)' \
|
|
|
|
# | grep -vEf .x-sc_prohibit_magic_number_exit \
|
|
|
|
# | xargs --no-run-if-empty \
|
|
|
|
# perl -pi -e 's/(^|[^.])\b(exit ?)\(0\)/$1$2(EXIT_SUCCESS)/'
|
|
|
|
sc_prohibit_magic_number_exit:
|
|
|
|
@prohibit='(^|[^.])\<(usage|exit|error) ?\(-?[0-9]+[,)]' \
|
|
|
|
exclude='exit \(77\)|error ?\(((0|77),|[^,]*)' \
|
|
|
|
halt='use EXIT_* values rather than magic number' \
|
|
|
|
$(_sc_search_regexp)
|
|
|
|
|
|
|
|
# "FATAL:" should be fully upper-cased in error messages
|
|
|
|
# "WARNING:" should be fully upper-cased, or fully lower-cased
|
|
|
|
sc_error_message_warn_fatal:
|
|
|
|
@$(VC_LIST_EXCEPT) \
|
|
|
|
| xargs $(GREP) -nEA2 '[^rp]error *\(' /dev/null \
|
|
|
|
| $(GREP) -E '"Warning|"Fatal|"fatal' \
|
|
|
|
&& { echo '$(ME): use FATAL, WARNING or warning' 1>&2; \
|
|
|
|
exit 1; } \
|
|
|
|
|| :
|
|
|
|
|
|
|
|
# Error messages should not end with a period
|
|
|
|
sc_error_message_period:
|
|
|
|
@$(VC_LIST_EXCEPT) \
|
|
|
|
| xargs $(GREP) -nEA2 '[^rp]error *\(' /dev/null \
|
|
|
|
| $(GREP) -E '[^."]\."' \
|
|
|
|
&& { echo '$(ME): found error message ending in period' 1>&2; \
|
|
|
|
exit 1; } \
|
|
|
|
|| :
|
|
|
|
|
|
|
|
# Don't use cpp tests of this symbol. All code assumes config.h is included.
|
|
|
|
sc_prohibit_have_config_h:
|
|
|
|
@prohibit='^# *if.*HAVE''_CONFIG_H' \
|
|
|
|
halt='found use of HAVE''_CONFIG_H; remove' \
|
|
|
|
$(_sc_search_regexp)
|
|
|
|
|
|
|
|
# Nearly all .c files must include <config.h>. However, we also permit this
|
|
|
|
# via inclusion of a package-specific header, if syntax-check.mk specified one.
|
|
|
|
# config_h_header must be suitable for grep -E.
|
|
|
|
config_h_header ?= <config\.h>
|
|
|
|
sc_require_config_h:
|
|
|
|
@require='^# *include $(config_h_header)' \
|
|
|
|
in_vc_files='\.c$$' \
|
|
|
|
halt='the above files do not include <config.h>' \
|
|
|
|
$(_sc_search_regexp)
|
|
|
|
|
|
|
|
# Print each file name for which the first #include does not match
|
|
|
|
# $(config_h_header). Like grep -m 1, this only looks at the first match.
|
|
|
|
perl_config_h_first_ = \
|
|
|
|
-e 'BEGIN {$$ret = 0}' \
|
|
|
|
-e 'if (/^\# *include\b/) {' \
|
|
|
|
-e ' if (not m{^\# *include $(config_h_header)}) {' \
|
|
|
|
-e ' print "$$ARGV\n";' \
|
|
|
|
-e ' $$ret = 1;' \
|
|
|
|
-e ' }' \
|
|
|
|
-e ' \# Move on to next file after first include' \
|
|
|
|
-e ' close ARGV;' \
|
|
|
|
-e '}' \
|
|
|
|
-e 'END {exit $$ret}'
|
|
|
|
|
|
|
|
# You must include <config.h> before including any other header file.
|
|
|
|
# This can possibly be via a package-specific header, if given by syntax-check.mk.
|
|
|
|
sc_require_config_h_first:
|
|
|
|
@if $(VC_LIST_EXCEPT) | $(GREP) '\.c$$' > /dev/null; then \
|
|
|
|
files=$$($(VC_LIST_EXCEPT) | $(GREP) '\.c$$') && \
|
|
|
|
perl -n $(perl_config_h_first_) $$files || \
|
|
|
|
{ echo '$(ME): the above files include some other header' \
|
|
|
|
'before <config.h>' 1>&2; exit 1; } || :; \
|
|
|
|
else :; \
|
|
|
|
fi
|
|
|
|
|
|
|
|
sc_prohibit_HAVE_MBRTOWC:
|
|
|
|
@prohibit='\bHAVE_MBRTOWC\b' \
|
|
|
|
halt="do not use $$prohibit; it is always defined" \
|
|
|
|
$(_sc_search_regexp)
|
|
|
|
|
|
|
|
# To use this "command" macro, you must first define two shell variables:
|
|
|
|
# h: the header name, with no enclosing <> or ""
|
|
|
|
# re: a regular expression that matches IFF something provided by $h is used.
|
|
|
|
define _sc_header_without_use
|
|
|
|
dummy=; : so we do not need a semicolon before each use; \
|
|
|
|
h_esc=`echo '[<"]'"$$h"'[">]'|$(SED) 's/\./\\\\./g'`; \
|
|
|
|
if $(VC_LIST_EXCEPT) | $(GREP) '\.c$$' > /dev/null; then \
|
|
|
|
files=$$($(GREP) -l '^# *include '"$$h_esc" \
|
|
|
|
$$($(VC_LIST_EXCEPT) | $(GREP) '\.c$$')) && \
|
|
|
|
$(GREP) -LE "$$re" $$files | $(GREP) . && \
|
|
|
|
{ echo "$(ME): the above files include $$h but don't use it" \
|
|
|
|
1>&2; exit 1; } || :; \
|
|
|
|
else :; \
|
|
|
|
fi
|
|
|
|
endef
|
|
|
|
|
|
|
|
# Prohibit the inclusion of assert.h without an actual use of assert.
|
|
|
|
sc_prohibit_assert_without_use:
|
|
|
|
@h='assert.h' re='\<assert *\(' $(_sc_header_without_use)
|
|
|
|
|
|
|
|
# Prohibit the inclusion of close-stream.h without an actual use.
|
|
|
|
sc_prohibit_close_stream_without_use:
|
|
|
|
@h='close-stream.h' re='\<close_stream *\(' $(_sc_header_without_use)
|
|
|
|
|
|
|
|
# Prohibit the inclusion of getopt.h without an actual use.
|
|
|
|
sc_prohibit_getopt_without_use:
|
|
|
|
@h='getopt.h' re='\<getopt(_long)? *\(' $(_sc_header_without_use)
|
|
|
|
|
|
|
|
# Don't include this header unless you use one of its functions.
|
|
|
|
sc_prohibit_long_options_without_use:
|
|
|
|
@h='long-options.h' re='\<parse_(long_options|gnu_standard_options_only) *\(' \
|
|
|
|
$(_sc_header_without_use)
|
|
|
|
|
|
|
|
# Don't include this header unless you use one of its functions.
|
|
|
|
sc_prohibit_inttostr_without_use:
|
|
|
|
@h='inttostr.h' re='\<(off|[iu]max|uint)tostr *\(' \
|
|
|
|
$(_sc_header_without_use)
|
|
|
|
|
|
|
|
# Don't include this header unless you use one of its functions.
|
|
|
|
sc_prohibit_ignore_value_without_use:
|
|
|
|
@h='ignore-value.h' re='\<ignore_(value|ptr) *\(' \
|
|
|
|
$(_sc_header_without_use)
|
|
|
|
|
|
|
|
# Don't include this header unless you use one of its functions.
|
|
|
|
sc_prohibit_error_without_use:
|
|
|
|
@h='error.h' \
|
|
|
|
re='\<error(_at_line|_print_progname|_one_per_line|_message_count)? *\('\
|
|
|
|
$(_sc_header_without_use)
|
|
|
|
|
|
|
|
# Don't include xalloc.h unless you use one of its functions.
|
|
|
|
# Consider these symbols:
|
|
|
|
# perl -lne '/^# *define (\w+)\(/ and print $1' lib/xalloc.h|grep -v '^__';
|
|
|
|
# perl -lne '/^(?:extern )?(?:void|char) \*?(\w+) *\(/ and print $1' lib/xalloc.h
|
|
|
|
# Divide into two sets on case, and filter each through this:
|
|
|
|
# | sort | perl -MRegexp::Assemble -le \
|
|
|
|
# 'print Regexp::Assemble->new(file => "/dev/stdin")->as_string'|sed 's/\?://g'
|
|
|
|
# Note this was produced by the above:
|
|
|
|
# _xa1 = \
|
|
|
|
#x(((2n?)?re|c(har)?|n(re|m)|z)alloc|alloc_(oversized|die)|m(alloc|emdup)|strdup)
|
|
|
|
# But we can do better, in at least two ways:
|
|
|
|
# 1) take advantage of two "dup"-suffixed strings:
|
|
|
|
# x(((2n?)?re|c(har)?|n(re|m)|[mz])alloc|alloc_(oversized|die)|(mem|str)dup)
|
|
|
|
# 2) notice that "c(har)?|[mz]" is equivalent to the shorter and more readable
|
|
|
|
# "char|[cmz]"
|
|
|
|
# x(((2n?)?re|char|n(re|m)|[cmz])alloc|alloc_(oversized|die)|(mem|str)dup)
|
|
|
|
_xa1 = x(((2n?)?re|char|n(re|m)|[cmz])alloc|alloc_(oversized|die)|(mem|str)dup)
|
|
|
|
_xa2 = X([CZ]|N?M)ALLOC
|
|
|
|
sc_prohibit_xalloc_without_use:
|
|
|
|
@h='xalloc.h' \
|
|
|
|
re='\<($(_xa1)|$(_xa2)) *\('\
|
|
|
|
$(_sc_header_without_use)
|
|
|
|
|
|
|
|
sc_prohibit_cloexec_without_use:
|
|
|
|
@h='cloexec.h' re='\<(set_cloexec_flag|dup_cloexec) *\(' \
|
|
|
|
$(_sc_header_without_use)
|
|
|
|
|
|
|
|
sc_prohibit_posixver_without_use:
|
|
|
|
@h='posixver.h' re='\<posix2_version *\(' $(_sc_header_without_use)
|
|
|
|
|
|
|
|
sc_prohibit_same_without_use:
|
|
|
|
@h='same.h' re='\<same_name(at)? *\(' $(_sc_header_without_use)
|
|
|
|
|
|
|
|
sc_prohibit_hash_pjw_without_use:
|
|
|
|
@h='hash-pjw.h' \
|
|
|
|
re='\<hash_pjw\>' \
|
|
|
|
$(_sc_header_without_use)
|
|
|
|
|
|
|
|
sc_prohibit_safe_read_without_use:
|
|
|
|
@h='safe-read.h' re='(\<SAFE_READ_ERROR\>|\<safe_read *\()' \
|
|
|
|
$(_sc_header_without_use)
|
|
|
|
|
|
|
|
sc_prohibit_argmatch_without_use:
|
|
|
|
@h='argmatch.h' \
|
|
|
|
re='(\<(ARRAY_CARDINALITY|X?ARGMATCH(|_TO_ARGUMENT|_VERIFY))\>|\<(invalid_arg|argmatch(_exit_fn|_(in)?valid)?) *\()' \
|
|
|
|
$(_sc_header_without_use)
|
|
|
|
|
|
|
|
sc_prohibit_canonicalize_without_use:
|
|
|
|
@h='canonicalize.h' \
|
|
|
|
re='CAN_(EXISTING|ALL_BUT_LAST|MISSING)|canonicalize_(mode_t|filename_mode|file_name)' \
|
|
|
|
$(_sc_header_without_use)
|
|
|
|
|
|
|
|
sc_prohibit_root_dev_ino_without_use:
|
|
|
|
@h='root-dev-ino.h' \
|
|
|
|
re='(\<ROOT_DEV_INO_(CHECK|WARN)\>|\<get_root_dev_ino *\()' \
|
|
|
|
$(_sc_header_without_use)
|
|
|
|
|
|
|
|
sc_prohibit_openat_without_use:
|
|
|
|
@h='openat.h' \
|
|
|
|
re='\<(openat_(permissive|needs_fchdir|(save|restore)_fail)|l?(stat|ch(own|mod))at|(euid)?accessat|(FCHMOD|FCHOWN|STAT)AT_INLINE)\>' \
|
|
|
|
$(_sc_header_without_use)
|
|
|
|
|
|
|
|
# The following list was generated by running:
|
|
|
|
# man signal.h|col -b|perl -ne '/bsd_signal.*;/.../sigwaitinfo.*;/ and print' \
|
|
|
|
# | perl -lne '/^\s+(?:int|void).*?(\w+).*/ and print $1' | fmt
|
|
|
|
_sig_functions = \
|
|
|
|
bsd_signal kill killpg pthread_kill pthread_sigmask raise sigaction \
|
|
|
|
sigaddset sigaltstack sigdelset sigemptyset sigfillset sighold sigignore \
|
|
|
|
siginterrupt sigismember signal sigpause sigpending sigprocmask sigqueue \
|
|
|
|
sigrelse sigset sigsuspend sigtimedwait sigwait sigwaitinfo
|
|
|
|
_sig_function_re = $(subst $(_sp),|,$(strip $(_sig_functions)))
|
|
|
|
# The following were extracted from "man signal.h" manually.
|
|
|
|
_sig_types_and_consts = \
|
|
|
|
MINSIGSTKSZ SA_NOCLDSTOP SA_NOCLDWAIT SA_NODEFER SA_ONSTACK \
|
|
|
|
SA_RESETHAND SA_RESTART SA_SIGINFO SIGEV_NONE SIGEV_SIGNAL \
|
|
|
|
SIGEV_THREAD SIGSTKSZ SIG_BLOCK SIG_SETMASK SIG_UNBLOCK SS_DISABLE \
|
|
|
|
SS_ONSTACK mcontext_t pid_t sig_atomic_t sigevent siginfo_t sigset_t \
|
|
|
|
sigstack sigval stack_t ucontext_t
|
|
|
|
# generated via this:
|
|
|
|
# perl -lne '/^#ifdef (SIG\w+)/ and print $1' lib/sig2str.c|sort -u|fmt -70
|
|
|
|
_sig_names = \
|
|
|
|
SIGABRT SIGALRM SIGALRM1 SIGBUS SIGCANCEL SIGCHLD SIGCLD SIGCONT \
|
|
|
|
SIGDANGER SIGDIL SIGEMT SIGFPE SIGFREEZE SIGGRANT SIGHUP SIGILL \
|
|
|
|
SIGINFO SIGINT SIGIO SIGIOT SIGKAP SIGKILL SIGKILLTHR SIGLOST SIGLWP \
|
|
|
|
SIGMIGRATE SIGMSG SIGPHONE SIGPIPE SIGPOLL SIGPRE SIGPROF SIGPWR \
|
|
|
|
SIGQUIT SIGRETRACT SIGSAK SIGSEGV SIGSOUND SIGSTKFLT SIGSTOP SIGSYS \
|
|
|
|
SIGTERM SIGTHAW SIGTRAP SIGTSTP SIGTTIN SIGTTOU SIGURG SIGUSR1 \
|
|
|
|
SIGUSR2 SIGVIRT SIGVTALRM SIGWAITING SIGWINCH SIGWIND SIGWINDOW \
|
|
|
|
SIGXCPU SIGXFSZ
|
|
|
|
_sig_syms_re = $(subst $(_sp),|,$(strip $(_sig_names) $(_sig_types_and_consts)))
|
|
|
|
|
|
|
|
# Prohibit the inclusion of signal.h without an actual use.
|
|
|
|
sc_prohibit_signal_without_use:
|
|
|
|
@h='signal.h' \
|
|
|
|
re='\<($(_sig_function_re)) *\(|\<($(_sig_syms_re))\>' \
|
|
|
|
$(_sc_header_without_use)
|
|
|
|
|
|
|
|
# Don't include stdio--.h unless you use one of its functions.
|
|
|
|
sc_prohibit_stdio--_without_use:
|
|
|
|
@h='stdio--.h' re='\<((f(re)?|p)open|tmpfile) *\(' \
|
|
|
|
$(_sc_header_without_use)
|
|
|
|
|
|
|
|
# Don't include stdio-safer.h unless you use one of its functions.
|
|
|
|
sc_prohibit_stdio-safer_without_use:
|
|
|
|
@h='stdio-safer.h' re='\<((f(re)?|p)open|tmpfile)_safer *\(' \
|
|
|
|
$(_sc_header_without_use)
|
|
|
|
|
|
|
|
# Prohibit the inclusion of strings.h without a sensible use.
|
|
|
|
# Using the likes of bcmp, bcopy, bzero, index or rindex is not sensible.
|
|
|
|
sc_prohibit_strings_without_use:
|
|
|
|
@h='strings.h' \
|
|
|
|
re='\<(strn?casecmp|ffs(ll)?)\>' \
|
|
|
|
$(_sc_header_without_use)
|
|
|
|
|
|
|
|
|
|
|
|
_stddef_syms_re = NULL|offsetof|ptrdiff_t|size_t|wchar_t
|
|
|
|
# Prohibit the inclusion of stddef.h without an actual use.
|
|
|
|
sc_prohibit_stddef_without_use:
|
|
|
|
@h='stddef.h' \
|
|
|
|
re='\<($(_stddef_syms_re))\>' \
|
|
|
|
$(_sc_header_without_use)
|
|
|
|
|
|
|
|
_de1 = dirfd|(close|(fd)?open|read|rewind|seek|tell)dir(64)?(_r)?
|
|
|
|
_de2 = (versionsort|struct dirent|getdirentries|alphasort|scandir(at)?)(64)?
|
|
|
|
_de3 = MAXNAMLEN|DIR|ino_t|d_ino|d_fileno|d_namlen
|
|
|
|
_dirent_syms_re = $(_de1)|$(_de2)|$(_de3)
|
|
|
|
# Prohibit the inclusion of dirent.h without an actual use.
|
|
|
|
sc_prohibit_dirent_without_use:
|
|
|
|
@h='dirent.h' \
|
|
|
|
re='\<($(_dirent_syms_re))\>' \
|
|
|
|
$(_sc_header_without_use)
|
|
|
|
|
|
|
|
# Don't include xfreopen.h unless you use one of its functions.
|
|
|
|
sc_prohibit_xfreopen_without_use:
|
|
|
|
@h='xfreopen.h' re='\<xfreopen *\(' $(_sc_header_without_use)
|
|
|
|
|
|
|
|
# Each nonempty ChangeLog line must start with a year number, or a TAB.
|
|
|
|
sc_changelog:
|
|
|
|
@prohibit='^[^12 ]' \
|
|
|
|
in_vc_files='^ChangeLog$$' \
|
|
|
|
halt='found unexpected prefix in a ChangeLog' \
|
|
|
|
$(_sc_search_regexp)
|
|
|
|
|
|
|
|
# Ensure that each .c file containing a "main" function also
|
|
|
|
# calls bindtextdomain.
|
|
|
|
sc_bindtextdomain:
|
|
|
|
@require='bindtextdomain *\(' \
|
|
|
|
in_vc_files='\.c$$' \
|
|
|
|
containing='\<main *(' \
|
|
|
|
halt='the above files do not call bindtextdomain' \
|
|
|
|
$(_sc_search_regexp)
|
|
|
|
|
|
|
|
sc_trailing_blank:
|
|
|
|
@prohibit='[ ]$$' \
|
|
|
|
halt='found trailing blank(s)' \
|
|
|
|
exclude='^Binary file .* matches$$' \
|
|
|
|
$(_sc_search_regexp)
|
|
|
|
|
|
|
|
|
|
|
|
# A regexp matching function names like "error" that may be used
|
|
|
|
# to emit translatable messages.
|
|
|
|
_gl_translatable_diag_func_re ?= error
|
|
|
|
|
|
|
|
# Look for diagnostics that aren't marked for translation.
|
|
|
|
# This won't find any for which error's format string is on a separate line.
|
|
|
|
sc_unmarked_diagnostics:
|
|
|
|
@prohibit='\<$(_gl_translatable_diag_func_re) *\([^"]*"[^"]*[a-z]{3}' \
|
|
|
|
exclude='(_|ngettext ?)\(' \
|
|
|
|
halt='found unmarked diagnostic(s)' \
|
|
|
|
$(_sc_search_regexp)
|
|
|
|
|
|
|
|
# List headers for which HAVE_HEADER_H is always true, assuming you are
|
|
|
|
# using the appropriate gnulib module. CAUTION: for each "unnecessary"
|
|
|
|
# #if HAVE_HEADER_H that you remove, be sure that your project explicitly
|
|
|
|
# requires the gnulib module that guarantees the usability of that header.
|
|
|
|
gl_assured_headers_ = \
|
|
|
|
cd $(gnulib_dir)/lib && echo *.in.h|$(SED) 's/\.in\.h//g'
|
|
|
|
|
|
|
|
# Convert the list of names to upper case, and replace each space with "|".
|
|
|
|
az_ = abcdefghijklmnopqrstuvwxyz
|
|
|
|
AZ_ = ABCDEFGHIJKLMNOPQRSTUVWXYZ
|
|
|
|
gl_header_upper_case_or_ = \
|
|
|
|
$$($(gl_assured_headers_) \
|
|
|
|
| tr $(az_)/.- $(AZ_)___ \
|
|
|
|
| tr -s ' ' '|' \
|
|
|
|
)
|
|
|
|
sc_prohibit_always_true_header_tests:
|
|
|
|
@or=$(gl_header_upper_case_or_); \
|
|
|
|
re="HAVE_($$or)_H"; \
|
|
|
|
prohibit='\<'"$$re"'\>' \
|
|
|
|
halt=$$(printf '%s\n' \
|
|
|
|
'do not test the above HAVE_<header>_H symbol(s);' \
|
|
|
|
' with the corresponding gnulib module, they are always true') \
|
|
|
|
$(_sc_search_regexp)
|
|
|
|
|
|
|
|
sc_prohibit_defined_have_decl_tests:
|
|
|
|
@prohibit='(#[ ]*ifn?def|\<defined)\>[ (]+HAVE_DECL_' \
|
|
|
|
halt='HAVE_DECL macros are always defined' \
|
|
|
|
$(_sc_search_regexp)
|
|
|
|
|
|
|
|
# ==================================================================
|
|
|
|
gl_other_headers_ ?= \
|
|
|
|
openat.h \
|
|
|
|
stat-macros.h
|
|
|
|
|
|
|
|
# Perl -lne code to extract "significant" cpp-defined symbols from a
|
|
|
|
# gnulib header file, eliminating a few common false-positives.
|
|
|
|
# The exempted names below are defined only conditionally in gnulib,
|
|
|
|
# and hence sometimes must/may be defined in application code.
|
|
|
|
gl_extract_significant_defines_ = \
|
|
|
|
/^\# *define ([^_ (][^ (]*)(\s*\(|\s+\w+)/\
|
|
|
|
&& $$2 !~ /(?:rpl_|_used_without_)/\
|
|
|
|
&& $$1 !~ /^(?:NSIG|ENODATA)$$/\
|
|
|
|
&& $$1 !~ /^(?:SA_RESETHAND|SA_RESTART)$$/\
|
|
|
|
and print $$1
|
|
|
|
|
|
|
|
# Create a list of regular expressions matching the names
|
|
|
|
# of macros that are guaranteed to be defined by parts of gnulib.
|
|
|
|
define def_sym_regex
|
|
|
|
gen_h=$(gl_generated_headers_); \
|
|
|
|
(cd $(gnulib_dir)/lib; \
|
|
|
|
for f in *.in.h $(gl_other_headers_); do \
|
|
|
|
test -f $$f \
|
|
|
|
&& perl -lne '$(gl_extract_significant_defines_)' $$f; \
|
|
|
|
done; \
|
|
|
|
) | sort -u \
|
|
|
|
| $(SED) 's/^/^ *# *(define|undef) */;s/$$/\\>/'
|
|
|
|
endef
|
|
|
|
|
|
|
|
# Don't define macros that we already get from gnulib header files.
|
|
|
|
sc_prohibit_always-defined_macros:
|
|
|
|
@if test -d $(gnulib_dir); then \
|
|
|
|
case $$(echo all: | $(GREP) -l -f - $(abs_top_builddir)/Makefile) in $(abs_top_builddir)/Makefile);; *) \
|
|
|
|
echo '$(ME): skipping $@: you lack GNU grep' 1>&2; exit 0;; \
|
|
|
|
esac; \
|
|
|
|
regex=$$($(def_sym_regex)); export regex; \
|
|
|
|
$(VC_LIST_EXCEPT) \
|
|
|
|
| xargs sh -c 'echo $$regex | $(GREP) -E -f - "$$@"' \
|
|
|
|
dummy /dev/null \
|
|
|
|
&& { printf '$(ME): define the above' \
|
|
|
|
' via some gnulib .h file\n' 1>&2; \
|
|
|
|
exit 1; } \
|
|
|
|
|| :; \
|
|
|
|
fi
|
|
|
|
# ==================================================================
|
|
|
|
|
|
|
|
# Prohibit checked in backup files.
|
|
|
|
sc_prohibit_backup_files:
|
|
|
|
@$(VC_LIST) | $(GREP) '~$$' && \
|
|
|
|
{ echo '$(ME): found version controlled backup file' 1>&2; \
|
|
|
|
exit 1; } || :
|
|
|
|
|
|
|
|
# Require the latest GFDL. Two regexp, since some .texi files end up
|
|
|
|
# line wrapping between 'Free Documentation License,' and 'Version'.
|
|
|
|
_GFDL_regexp = (Free ''Documentation.*Version 1\.[^3]|Version 1\.[^3] or any)
|
|
|
|
sc_GFDL_version:
|
|
|
|
@prohibit='$(_GFDL_regexp)' \
|
|
|
|
halt='GFDL vN, N!=3' \
|
|
|
|
$(_sc_search_regexp)
|
|
|
|
|
|
|
|
cvs_keywords = \
|
|
|
|
Author|Date|Header|Id|Name|Locker|Log|RCSfile|Revision|Source|State
|
|
|
|
|
|
|
|
sc_prohibit_cvs_keyword:
|
|
|
|
@prohibit='\$$($(cvs_keywords))\$$' \
|
|
|
|
halt='do not use CVS keyword expansion' \
|
|
|
|
$(_sc_search_regexp)
|
|
|
|
|
|
|
|
# This Perl code is slightly obfuscated. Not only is each "$" doubled
|
|
|
|
# because it's in a Makefile, but the $$c's are comments; we cannot
|
|
|
|
# use "#" due to the way the script ends up concatenated onto one line.
|
|
|
|
# It would be much more concise, and would produce better output (including
|
|
|
|
# counts) if written as:
|
|
|
|
# perl -ln -0777 -e '/\n(\n+)$/ and print "$ARGV: ".length $1' ...
|
|
|
|
# but that would be far less efficient, reading the entire contents
|
|
|
|
# of each file, rather than just the last two bytes of each.
|
|
|
|
# In addition, while the code below detects both blank lines and a missing
|
|
|
|
# newline at EOF, the above detects only the former.
|
|
|
|
#
|
|
|
|
# This is a perl script that is expected to be the single-quoted argument
|
|
|
|
# to a command-line "-le". The remaining arguments are file names.
|
|
|
|
# Print the name of each file that does not end in exactly one newline byte.
|
|
|
|
# I.e., warn if there are blank lines (2 or more newlines), or if the
|
|
|
|
# last byte is not a newline. However, currently we don't complain
|
|
|
|
# about any file that contains exactly one byte.
|
|
|
|
# Exit nonzero if at least one such file is found, otherwise, exit 0.
|
|
|
|
# Warn about, but otherwise ignore open failure. Ignore seek/read failure.
|
|
|
|
#
|
|
|
|
# Use this if you want to remove trailing empty lines from selected files:
|
|
|
|
# perl -pi -0777 -e 's/\n\n+$/\n/' files...
|
|
|
|
#
|
|
|
|
require_exactly_one_NL_at_EOF_ = \
|
|
|
|
foreach my $$f (@ARGV) \
|
|
|
|
{ \
|
|
|
|
open F, "<", $$f or (warn "failed to open $$f: $$!\n"), next; \
|
|
|
|
my $$p = sysseek (F, -2, 2); \
|
|
|
|
my $$c = "seek failure probably means file has < 2 bytes; ignore"; \
|
|
|
|
my $$last_two_bytes; \
|
|
|
|
defined $$p and $$p = sysread F, $$last_two_bytes, 2; \
|
|
|
|
close F; \
|
|
|
|
$$c = "ignore read failure"; \
|
|
|
|
$$p && ($$last_two_bytes eq "\n\n" \
|
|
|
|
|| substr ($$last_two_bytes,1) ne "\n") \
|
|
|
|
and (print $$f), $$fail=1; \
|
|
|
|
} \
|
|
|
|
END { exit defined $$fail }
|
|
|
|
sc_prohibit_empty_lines_at_EOF:
|
|
|
|
@$(VC_LIST_EXCEPT) \
|
|
|
|
| xargs perl -le '$(require_exactly_one_NL_at_EOF_)' \
|
|
|
|
|| { echo '$(ME): empty line(s) or no newline at EOF' 1>&2; \
|
|
|
|
exit 1; } \
|
|
|
|
|| :
|
|
|
|
|
|
|
|
|
|
|
|
# Perl block to convert a match to FILE_NAME:LINENO:TEST,
|
|
|
|
# that is shared by two definitions below.
|
|
|
|
perl_filename_lineno_text_ = \
|
|
|
|
-e ' {' \
|
|
|
|
-e ' $$n = ($$` =~ tr/\n/\n/ + 1);' \
|
|
|
|
-e ' ($$v = $$&) =~ s/\n/\\n/g;' \
|
|
|
|
-e ' print "$$ARGV:$$n:$$v\n";' \
|
|
|
|
-e ' }'
|
|
|
|
|
|
|
|
prohibit_doubled_words_ = \
|
|
|
|
the then in an on if is it but for or at and do to
|
|
|
|
# expand the regex before running the check to avoid using expensive captures
|
|
|
|
prohibit_doubled_word_expanded_ = \
|
|
|
|
$(join $(prohibit_doubled_words_),$(addprefix \s+,$(prohibit_doubled_words_)))
|
|
|
|
prohibit_doubled_word_RE_ ?= \
|
|
|
|
/\b(?:$(subst $(_sp),|,$(prohibit_doubled_word_expanded_)))\b/gims
|
|
|
|
prohibit_doubled_word_ = \
|
|
|
|
-e 'while ($(prohibit_doubled_word_RE_))' \
|
|
|
|
$(perl_filename_lineno_text_)
|
|
|
|
|
|
|
|
# Define this to a regular expression that matches
|
|
|
|
# any filename:dd:match lines you want to ignore.
|
|
|
|
# The default is to ignore no matches.
|
|
|
|
ignore_doubled_word_match_RE_ ?= ^$$
|
|
|
|
|
|
|
|
sc_prohibit_doubled_word:
|
|
|
|
@$(VC_LIST_EXCEPT) \
|
|
|
|
| xargs perl -n -0777 $(prohibit_doubled_word_) \
|
|
|
|
| $(GREP) -vE '$(ignore_doubled_word_match_RE_)' \
|
|
|
|
| $(GREP) . \
|
|
|
|
&& { echo '$(ME): doubled words' 1>&2; exit 1; } \
|
|
|
|
|| :
|
|
|
|
|
|
|
|
# Except for shell files and for loops, double semicolon is probably a mistake
|
|
|
|
sc_prohibit_double_semicolon:
|
|
|
|
@prohibit='; *;[ {} \]*(/[/*]|$$)' \
|
|
|
|
in_vc_files='\.[chly]$$' \
|
|
|
|
exclude='\bfor *\(.*\)' \
|
|
|
|
halt="Double semicolon detected" \
|
|
|
|
$(_sc_search_regexp)
|
|
|
|
|
|
|
|
_ptm1 = use "test C1 && test C2", not "test C1 -''a C2"
|
|
|
|
_ptm2 = use "test C1 || test C2", not "test C1 -''o C2"
|
|
|
|
# Using test's -a and -o operators is not portable.
|
|
|
|
# We prefer test over [, since the latter is spelled [[ in configure.ac.
|
|
|
|
sc_prohibit_test_minus_ao:
|
|
|
|
@prohibit='(\<test| \[+) .+ -[ao] ' \
|
|
|
|
halt='$(_ptm1); $(_ptm2)' \
|
|
|
|
$(_sc_search_regexp)
|
|
|
|
|
|
|
|
# Avoid a test bashism.
|
|
|
|
sc_prohibit_test_double_equal:
|
|
|
|
@prohibit='(\<test| \[+) .+ == ' \
|
|
|
|
containing='#! */bin/[a-z]*sh' \
|
|
|
|
halt='use "test x = x", not "test x =''= x"' \
|
|
|
|
$(_sc_search_regexp)
|
|
|
|
|
|
|
|
# Each program that uses proper_name_utf8 must link with one of the
|
|
|
|
# ICONV libraries. Otherwise, some ICONV library must appear in LDADD.
|
|
|
|
# The perl -0777 invocation below extracts the possibly-multi-line
|
|
|
|
# definition of LDADD from the appropriate Makefile.am and exits 0
|
|
|
|
# when it contains "ICONV".
|
|
|
|
sc_proper_name_utf8_requires_ICONV:
|
|
|
|
@progs=$$($(VC_LIST_EXCEPT) \
|
|
|
|
| xargs $(GREP) -l 'proper_name_utf8 ''("'); \
|
|
|
|
if test "x$$progs" != x; then \
|
|
|
|
fail=0; \
|
|
|
|
for p in $$progs; do \
|
|
|
|
dir=$$(dirname "$$p"); \
|
|
|
|
perl -0777 \
|
|
|
|
-ne 'exit !(/^LDADD =(.+?[^\\]\n)/ms && $$1 =~ /ICONV/)' \
|
|
|
|
$$dir/Makefile.am && continue; \
|
|
|
|
base=$$(basename "$$p" .c); \
|
|
|
|
$(GREP) "$${base}_LDADD.*ICONV)" $$dir/Makefile.am > /dev/null \
|
|
|
|
|| { fail=1; echo 1>&2 "$(ME): $$p uses proper_name_utf8"; }; \
|
|
|
|
done; \
|
|
|
|
test $$fail = 1 && \
|
|
|
|
{ echo 1>&2 '$(ME): the above do not link with any ICONV library'; \
|
|
|
|
exit 1; } || :; \
|
|
|
|
fi
|
|
|
|
|
|
|
|
# Warn about "c0nst struct Foo const foo[]",
|
|
|
|
# but not about "char const *const foo" or "#define const const".
|
|
|
|
sc_redundant_const:
|
|
|
|
@prohibit='\bconst\b[[:space:][:alnum:]]{2,}\bconst\b' \
|
|
|
|
halt='redundant "const" in declarations' \
|
|
|
|
$(_sc_search_regexp)
|
|
|
|
|
|
|
|
sc_const_long_option:
|
|
|
|
@prohibit='^ *static.*struct option ' \
|
|
|
|
exclude='const struct option|struct option const' \
|
|
|
|
halt='add "const" to the above declarations' \
|
|
|
|
$(_sc_search_regexp)
|
|
|
|
|
|
|
|
NEWS_hash = \
|
|
|
|
$$($(SED) -n '/^\*.* $(PREV_VERSION_REGEXP) ([0-9-]*)/,$$p' \
|
|
|
|
$(srcdir)/NEWS \
|
|
|
|
| perl -0777 -pe \
|
|
|
|
's/^Copyright.+?Free\sSoftware\sFoundation,\sInc\.\n//ms' \
|
|
|
|
| md5sum - \
|
|
|
|
| $(SED) 's/ .*//')
|
|
|
|
|
|
|
|
# Update the hash stored above. Do this after each release and
|
|
|
|
# for any corrections to old entries.
|
|
|
|
update-NEWS-hash: NEWS
|
|
|
|
perl -pi -e 's/^(old_NEWS_hash[ \t]+:?=[ \t]+).*/$${1}'"$(NEWS_hash)/" \
|
|
|
|
$(srcdir)/syntax-check.mk
|
|
|
|
|
|
|
|
# Ensure that we use only the standard $(VAR) notation,
|
|
|
|
# not @...@ in Makefile.am, now that we can rely on automake
|
|
|
|
# to emit a definition for each substituted variable.
|
|
|
|
# However, there is still one case in which @VAR@ use is not just
|
|
|
|
# legitimate, but actually required: when augmenting an automake-defined
|
|
|
|
# variable with a prefix. For example, gettext uses this:
|
|
|
|
# MAKEINFO = env LANG= LC_MESSAGES= LC_ALL= LANGUAGE= @MAKEINFO@
|
|
|
|
# otherwise, makeinfo would put German or French (current locale)
|
|
|
|
# navigation hints in the otherwise-English documentation.
|
|
|
|
#
|
|
|
|
# Allow the package to add exceptions via a hook in syntax-check.mk;
|
|
|
|
# for example, @PRAGMA_SYSTEM_HEADER@ can be permitted by
|
|
|
|
# setting this to ' && !/PRAGMA_SYSTEM_HEADER/'.
|
|
|
|
_makefile_at_at_check_exceptions ?=
|
|
|
|
sc_makefile_at_at_check:
|
|
|
|
@perl -ne '/\@\w+\@/' \
|
|
|
|
-e ' && !/(\w+)\s+=.*\@\1\@$$/' \
|
|
|
|
-e ''$(_makefile_at_at_check_exceptions) \
|
|
|
|
-e 'and (print "$$ARGV:$$.: $$_"), $$m=1; END {exit !$$m}' \
|
|
|
|
$$($(VC_LIST_EXCEPT) | $(GREP) -E '(^|/)(Makefile\.am|[^/]+\.mk)$$') \
|
|
|
|
&& { echo '$(ME): use $$(...), not @...@' 1>&2; exit 1; } || :
|
|
|
|
|
|
|
|
sc_makefile_TAB_only_indentation:
|
|
|
|
@prohibit='^ [ ]{8}' \
|
|
|
|
in_vc_files='akefile|\.mk$$' \
|
|
|
|
halt='found TAB-8-space indentation' \
|
|
|
|
$(_sc_search_regexp)
|
|
|
|
|
|
|
|
sc_m4_quote_check:
|
|
|
|
@prohibit='(AC_DEFINE(_UNQUOTED)?|AC_DEFUN)\([^[]' \
|
|
|
|
in_vc_files='(^configure\.ac|\.m4)$$' \
|
|
|
|
halt='quote the first arg to AC_DEF*' \
|
|
|
|
$(_sc_search_regexp)
|
|
|
|
|
2019-10-23 13:35:05 +00:00
|
|
|
gen_source_files:
|
|
|
|
$(MAKE) -C src generated-sources
|
|
|
|
|
2019-10-02 16:51:19 +00:00
|
|
|
fix_po_file_diag = \
|
|
|
|
'you have changed the set of files with translatable diagnostics;\n\
|
|
|
|
apply the above patch\n'
|
|
|
|
|
|
|
|
# Generate a list of files in which to search for translatable strings.
|
|
|
|
perl_translatable_files_list_ = \
|
|
|
|
-e 'foreach $$file (@ARGV) {' \
|
|
|
|
-e ' \# Consider only file extensions with one or two letters' \
|
|
|
|
-e ' $$file =~ /\...?$$/ or next;' \
|
|
|
|
-e ' \# Ignore m4 and mk files' \
|
|
|
|
-e ' $$file =~ /\.m[4k]$$/ and next;' \
|
|
|
|
-e ' \# Ignore a .c or .h file with a corresponding .l or .y file' \
|
|
|
|
-e ' $$file =~ /(.+)\.[ch]$$/ && (-e "$${1}.l" || -e "$${1}.y")' \
|
|
|
|
-e ' and next;' \
|
|
|
|
-e ' \# Skip unreadable files' \
|
|
|
|
-e ' -r $$file or next;' \
|
|
|
|
-e ' print "$$file ";' \
|
|
|
|
-e '}'
|
|
|
|
|
|
|
|
# Verify that all source files using _() (more specifically, files that
|
|
|
|
# match $(_gl_translatable_string_re)) are listed in po/POTFILES.in.
|
2019-11-08 14:25:33 +00:00
|
|
|
po_file ?= $(srcdir)/po/POTFILES.in
|
2019-10-23 19:33:31 +00:00
|
|
|
|
|
|
|
# List of additional files that we want to pick up in our POTFILES.in
|
|
|
|
# This is all gnulib files, as well as generated files for RPC code.
|
|
|
|
generated_files = \
|
2019-11-08 14:25:33 +00:00
|
|
|
$(builddir)/src/*.[ch] \
|
|
|
|
$(builddir)/src/*/*.[ch] \
|
2019-10-23 19:33:31 +00:00
|
|
|
$(srcdir)/gnulib/lib/*.[ch]
|
|
|
|
|
2019-10-02 16:51:19 +00:00
|
|
|
_gl_translatable_string_re ?= \b(N?_|gettext *)\([^)"]*("|$$)
|
2019-10-23 13:35:05 +00:00
|
|
|
|
|
|
|
# sc_po_check can fail if generated files are not built first
|
|
|
|
sc_po_check: gen_source_files
|
2019-10-02 16:51:19 +00:00
|
|
|
@if test -f $(po_file); then \
|
|
|
|
$(GREP) -E -v '^(#|$$)' $(po_file) \
|
|
|
|
| $(GREP) -v '^src/false\.c$$' | sort > $@-1; \
|
|
|
|
{ $(VC_LIST_EXCEPT); echo $(generated_files); } \
|
|
|
|
| xargs perl $(perl_translatable_files_list_) \
|
|
|
|
| xargs $(GREP) -E -l '$(_gl_translatable_string_re)' \
|
2019-11-08 14:25:33 +00:00
|
|
|
| $(SED) 's|^$(_dot_escaped_srcdir)|@SRCDIR@|' \
|
|
|
|
| $(SED) 's|^$(_dot_escaped_builddir)|@BUILDDIR@|' \
|
2019-10-02 16:51:19 +00:00
|
|
|
| sort -u > $@-2; \
|
|
|
|
diff -u -L $(po_file) -L $(po_file) $@-1 $@-2 \
|
|
|
|
|| { printf '$(ME): '$(fix_po_file_diag) 1>&2; exit 1; }; \
|
|
|
|
rm -f $@-1 $@-2; \
|
|
|
|
fi
|
|
|
|
|
|
|
|
# Check that 'make alpha' will not fail at the end of the process,
|
|
|
|
# i.e., when pkg-M.N.tar.xz already exists (either in "." or in ../release)
|
|
|
|
# and is read-only.
|
|
|
|
writable-files:
|
|
|
|
$(AM_V_GEN)if test -d $(release_archive_dir); then \
|
|
|
|
for file in $(DIST_ARCHIVES); do \
|
|
|
|
for p in ./ $(release_archive_dir)/; do \
|
|
|
|
test -e $$p$$file || continue; \
|
|
|
|
test -w $$p$$file \
|
|
|
|
|| { echo ERROR: $$p$$file is not writable; fail=1; }; \
|
|
|
|
done; \
|
|
|
|
done; \
|
|
|
|
test "$$fail" && exit 1 || : ; \
|
|
|
|
else :; \
|
|
|
|
fi
|
|
|
|
|
|
|
|
v_etc_file = $(gnulib_dir)/lib/version-etc.c
|
|
|
|
sample-test = tests/sample-test
|
|
|
|
texi = doc/$(PACKAGE).texi
|
|
|
|
# Make sure that the copyright date in $(v_etc_file) is up to date.
|
|
|
|
# Do the same for the $(sample-test) and the main doc/.texi file.
|
|
|
|
sc_copyright_check:
|
|
|
|
@require='enum { COPYRIGHT_YEAR = '$$(date +%Y)' };' \
|
|
|
|
in_files=$(v_etc_file) \
|
|
|
|
halt='out of date copyright in $(v_etc_file); update it' \
|
|
|
|
$(_sc_search_regexp)
|
|
|
|
@require='# Copyright \(C\) '$$(date +%Y)' Free' \
|
|
|
|
in_vc_files=$(sample-test) \
|
|
|
|
halt='out of date copyright in $(sample-test); update it' \
|
|
|
|
$(_sc_search_regexp)
|
|
|
|
@require='Copyright @copyright\{\} .*'$$(date +%Y) \
|
|
|
|
in_vc_files=$(texi) \
|
|
|
|
halt='out of date copyright in $(texi); update it' \
|
|
|
|
$(_sc_search_regexp)
|
|
|
|
|
|
|
|
|
|
|
|
# BRE regex of file contents to identify a test script.
|
|
|
|
_test_script_regex ?= \<init\.sh\>
|
|
|
|
|
|
|
|
# In tests, use "compare expected actual", not the reverse.
|
|
|
|
sc_prohibit_reversed_compare_failure:
|
|
|
|
@prohibit='\<compare [^ ]+ ([^ ]*exp|/dev/null)' \
|
|
|
|
containing='$(_test_script_regex)' \
|
|
|
|
halt='reversed compare arguments' \
|
|
|
|
$(_sc_search_regexp)
|
|
|
|
|
|
|
|
# #if HAVE_... will evaluate to false for any non numeric string.
|
|
|
|
# That would be flagged by using -Wundef, however gnulib currently
|
|
|
|
# tests many undefined macros, and so we can't enable that option.
|
|
|
|
# So at least preclude common boolean strings as macro values.
|
|
|
|
sc_Wundef_boolean:
|
|
|
|
@prohibit='^#define.*(yes|no|true|false)$$' \
|
|
|
|
in_files='$(CONFIG_INCLUDE)' \
|
|
|
|
halt='Use 0 or 1 for macro values' \
|
|
|
|
$(_sc_search_regexp)
|
|
|
|
|
|
|
|
# Even if you use pathmax.h to guarantee that PATH_MAX is defined, it might
|
|
|
|
# not be constant, or might overflow a stack. In general, use PATH_MAX as
|
|
|
|
# a limit, not an array or alloca size.
|
|
|
|
sc_prohibit_path_max_allocation:
|
|
|
|
@prohibit='(\balloca *\([^)]*|\[[^]]*)\bPATH_MAX' \
|
|
|
|
halt='Avoid stack allocations of size PATH_MAX' \
|
|
|
|
$(_sc_search_regexp)
|
|
|
|
|
|
|
|
sc_vulnerable_makefile_CVE-2009-4029:
|
|
|
|
@prohibit='perm -777 -exec chmod a\+rwx|chmod 777 \$$\(distdir\)' \
|
|
|
|
in_files='(^|/)Makefile\.in$$' \
|
|
|
|
halt=$$(printf '%s\n' \
|
|
|
|
'the above files are vulnerable; beware of running' \
|
|
|
|
' "make dist*" rules, and upgrade to fixed automake' \
|
|
|
|
' see https://bugzilla.redhat.com/show_bug.cgi?id=542609 for details') \
|
|
|
|
$(_sc_search_regexp)
|
|
|
|
|
|
|
|
sc_vulnerable_makefile_CVE-2012-3386:
|
|
|
|
@prohibit='chmod a\+w \$$\(distdir\)' \
|
|
|
|
in_files='(^|/)Makefile\.in$$' \
|
|
|
|
halt=$$(printf '%s\n' \
|
|
|
|
'the above files are vulnerable; beware of running' \
|
|
|
|
' "make distcheck", and upgrade to fixed automake' \
|
|
|
|
' see https://bugzilla.redhat.com/show_bug.cgi?id=CVE-2012-3386 for details') \
|
|
|
|
$(_sc_search_regexp)
|
|
|
|
|
|
|
|
# We don't use this feature of syntax-check.mk.
|
2009-07-07 16:08:45 +00:00
|
|
|
prev_version_file = /dev/null
|
2009-07-10 08:01:04 +00:00
|
|
|
|
2014-06-04 21:48:20 +00:00
|
|
|
ifneq ($(_gl-Makefile),)
|
2009-07-10 08:01:04 +00:00
|
|
|
ifeq (0,$(MAKELEVEL))
|
2017-04-12 11:09:08 +00:00
|
|
|
_dry_run_result := $(shell \
|
|
|
|
cd '$(srcdir)'; \
|
|
|
|
test -d .git || test -f .git || { echo 0; exit; }; \
|
|
|
|
$(srcdir)/autogen.sh --dry-run >/dev/null 2>&1; \
|
|
|
|
echo $$?; \
|
|
|
|
)
|
2010-04-06 19:08:01 +00:00
|
|
|
_clean_requested = $(filter %clean,$(MAKECMDGOALS))
|
2017-04-12 11:09:08 +00:00
|
|
|
|
|
|
|
# A return value of 0 means no action is required
|
|
|
|
|
|
|
|
# A return value of 1 means a genuine error has occurred while
|
|
|
|
# performing the dry run, and it should be reported so it can
|
|
|
|
# be investigated
|
|
|
|
ifeq (1,$(_dry_run_result))
|
|
|
|
$(info INFO: autogen.sh error, running again to show details)
|
2019-10-02 16:51:19 +00:00
|
|
|
syntax-check.mk Makefile: _autogen_error
|
2017-04-12 11:09:08 +00:00
|
|
|
endif
|
|
|
|
|
|
|
|
# A return value of 2 means that autogen.sh needs to be executed
|
|
|
|
# in earnest before building, probably because of gnulib updates.
|
|
|
|
# We don't run autogen.sh if the clean target has been invoked,
|
|
|
|
# though, as it would be quite pointless
|
|
|
|
ifeq (2,$(_dry_run_result)$(_clean_requested))
|
|
|
|
$(info INFO: running autogen.sh is required, running it now...)
|
2019-04-01 15:33:03 +00:00
|
|
|
$(shell touch $(srcdir)/AUTHORS)
|
2019-10-02 16:51:19 +00:00
|
|
|
syntax-check.mk Makefile: _autogen
|
2009-07-10 08:01:04 +00:00
|
|
|
endif
|
|
|
|
endif
|
2014-06-04 21:48:20 +00:00
|
|
|
endif
|
2010-01-15 10:09:01 +00:00
|
|
|
|
build: avoid infinite autogen loop
Several people have reported that if the .gnulib submodule is dirty,
then 'make' will go into an infinite loop attempting to rerun bootstrap,
because that never cleans up the dirty submodule. By default, we
should halt and make the user investigate, but if the user doesn't
know why or care that the submodule is dirty, I also added the ability
to 'make CLEAN_SUBMODULE=1' to get things going again.
Also, while testing this, I noticed that when a submodule update was
needed, 'make' would first run autoreconf, then bootstrap (which
reruns autoreconf); adding a strategic dependency allows for less work.
* .gnulib: Update to latest, for maint.mk improvements.
* cfg.mk (_autogen): Also hook maint.mk, to run before autoreconf.
* autogen.sh (bootstrap): Refuse to run if gnulib is dirty, unless
user requests discarding gnulib changes.
2012-10-01 15:10:20 +00:00
|
|
|
# It is necessary to call autogen any time gnulib changes. Autogen
|
|
|
|
# reruns configure, then we regenerate all Makefiles at once.
|
|
|
|
.PHONY: _autogen
|
|
|
|
_autogen:
|
|
|
|
$(srcdir)/autogen.sh
|
|
|
|
./config.status
|
|
|
|
|
2017-04-12 11:09:08 +00:00
|
|
|
.PHONY: _autogen_error
|
|
|
|
_autogen_error:
|
|
|
|
$(srcdir)/autogen.sh --dry-run
|
|
|
|
|
2014-06-04 21:48:20 +00:00
|
|
|
ifneq ($(_gl-Makefile),)
|
2017-06-26 06:45:44 +00:00
|
|
|
syntax-check: spacing-check test-wrap-argv \
|
2018-12-13 13:32:06 +00:00
|
|
|
prohibit-duplicate-header mock-noinline group-qemu-caps \
|
|
|
|
header-ifdef
|
2019-06-17 16:19:03 +00:00
|
|
|
@if ! cppi --version >/dev/null 2>&1; then \
|
|
|
|
echo "*****************************************************" >&2; \
|
|
|
|
echo "* cppi not installed, some checks have been skipped *" >&2; \
|
|
|
|
echo "*****************************************************" >&2; \
|
2019-09-18 04:19:43 +00:00
|
|
|
fi; \
|
|
|
|
if [ -z "$(FLAKE8)" ]; then \
|
|
|
|
echo "*****************************************************" >&2; \
|
|
|
|
echo "* flake8 not installed, sc_flake8 has been skipped *" >&2; \
|
|
|
|
echo "*****************************************************" >&2; \
|
2019-06-17 16:19:03 +00:00
|
|
|
fi
|
2014-06-04 21:48:20 +00:00
|
|
|
endif
|
2012-10-17 09:25:35 +00:00
|
|
|
|
2016-06-15 16:01:24 +00:00
|
|
|
# Don't include duplicate header in the source (either *.c or *.h)
|
|
|
|
prohibit-duplicate-header:
|
2019-08-30 12:22:54 +00:00
|
|
|
$(AM_V_GEN)$(VC_LIST_EXCEPT) | $(GREP) '\.[chx]$$' | $(RUNUTF8) xargs \
|
|
|
|
$(PYTHON) $(top_srcdir)/scripts/prohibit-duplicate-header.py
|
2016-06-15 16:01:24 +00:00
|
|
|
|
2016-06-15 07:15:38 +00:00
|
|
|
spacing-check:
|
2019-01-03 19:30:39 +00:00
|
|
|
$(AM_V_GEN)$(VC_LIST) | $(GREP) '\.c$$' | xargs \
|
|
|
|
$(PERL) $(top_srcdir)/build-aux/check-spacing.pl || \
|
2017-06-26 06:45:44 +00:00
|
|
|
{ echo '$(ME): incorrect formatting' 1>&2; exit 1; }
|
2011-03-16 21:25:56 +00:00
|
|
|
|
2017-04-07 14:07:49 +00:00
|
|
|
mock-noinline:
|
2019-08-30 12:22:54 +00:00
|
|
|
$(AM_V_GEN)$(VC_LIST) | $(GREP) '\.[ch]$$' | $(RUNUTF8) xargs \
|
|
|
|
$(PYTHON) $(top_srcdir)/scripts/mock-noinline.py
|
2017-04-07 14:07:49 +00:00
|
|
|
|
2018-12-13 13:32:06 +00:00
|
|
|
header-ifdef:
|
2019-08-30 12:22:54 +00:00
|
|
|
$(AM_V_GEN)$(VC_LIST) | $(GREP) '\.[h]$$' | $(RUNUTF8) xargs \
|
|
|
|
$(PYTHON) $(top_srcdir)/scripts/header-ifdef.py
|
2018-12-13 13:32:06 +00:00
|
|
|
|
2015-11-06 13:20:06 +00:00
|
|
|
test-wrap-argv:
|
2019-08-30 12:22:54 +00:00
|
|
|
$(AM_V_GEN)$(VC_LIST) | $(GREP) -E '\.(ldargs|args)' | $(RUNUTF8) xargs \
|
|
|
|
$(PYTHON) $(top_srcdir)/scripts/test-wrap-argv.py --check
|
2015-11-06 13:20:06 +00:00
|
|
|
|
2018-04-12 06:16:12 +00:00
|
|
|
group-qemu-caps:
|
2019-08-30 12:22:54 +00:00
|
|
|
$(AM_V_GEN)$(RUNUTF8) $(PYTHON) $(top_srcdir)/scripts/group-qemu-caps.py \
|
|
|
|
--check --prefix $(top_srcdir)/
|
2018-04-12 06:16:12 +00:00
|
|
|
|
2011-03-16 21:25:56 +00:00
|
|
|
# List all syntax-check exemptions:
|
2015-06-15 16:53:58 +00:00
|
|
|
exclude_file_name_regexp--sc_avoid_strcase = ^tools/vsh\.h$$
|
2011-03-31 02:26:27 +00:00
|
|
|
|
2017-03-07 09:34:47 +00:00
|
|
|
_src1=libvirt-stream|qemu/qemu_monitor|util/vir(command|file|fdstream)|xen/xend_internal|rpc/virnetsocket|lxc/lxc_controller|locking/lock_daemon|logging/log_daemon
|
2017-09-20 11:03:47 +00:00
|
|
|
_test1=shunloadtest|virnettlscontexttest|virnettlssessiontest|vircgroupmock|commandhelper
|
2011-03-16 21:25:56 +00:00
|
|
|
exclude_file_name_regexp--sc_avoid_write = \
|
2018-02-20 13:16:28 +00:00
|
|
|
^(src/($(_src1))|tools/virsh-console|tests/($(_test1)))\.c$$
|
2011-03-16 21:25:56 +00:00
|
|
|
|
2016-04-12 22:29:52 +00:00
|
|
|
exclude_file_name_regexp--sc_bindtextdomain = .*
|
|
|
|
|
tools: split virt-login-shell into two binaries
The virt-login-shell binary is a setuid program that takes
no arguments. When invoked it looks at the invoking uid,
resolves it to a username, and finds an LXC guest with the
same name. It then starts the guest and runs the shell in
side the namespaces of the container.
Given this set of tasks the virt-login-shell binary needs
to connect to libvirtd, make various other libvirt API calls.
This is a problem for setuid binaries as various libraries
that libvirt.so links to are not safe. For example, they have
constructor functions which execute an unknown amount of code
that can be influenced by env variables.
For this reason virt-login-shell doesn't use libvirt.so,
but instead links to a custom, cut down, set of source files
sufficient to be a local client only.
This introduces a problem for integrating glib2 into libvirt
though, as once integrated, there would be no way to build
virt-login-shell without an external dependancy on glib2 and
this is definitely not setuid safe.
To resolve this problem, we split the virt-login-shell binary
into two parts. The first part is setuid and does almost
nothing. It simply records the original uid+gid, and then
invokes the virt-login-shell-helper binary. Crucially when
it does this it completes scrubs all environment variables.
It is thus safe for virt-login-shell-helper to link to the
normal libvirt.so. Any things that constructor functions
do cannot be influenced by user control env vars or cli
args.
Reviewed-by: Michal Privoznik <mprivozn@redhat.com>
Signed-off-by: Daniel P. Berrangé <berrange@redhat.com>
2019-08-01 09:58:31 +00:00
|
|
|
exclude_file_name_regexp--sc_gettext_init = ^((tests|examples)/|tools/virt-login-shell.c)
|
2011-03-16 21:25:56 +00:00
|
|
|
|
2016-04-11 15:00:26 +00:00
|
|
|
exclude_file_name_regexp--sc_copyright_format = \
|
2019-10-02 16:51:19 +00:00
|
|
|
^build-aux/syntax-check\.mk$$
|
2016-04-11 15:00:26 +00:00
|
|
|
|
2013-05-14 23:41:15 +00:00
|
|
|
exclude_file_name_regexp--sc_copyright_usage = \
|
2019-10-02 16:51:19 +00:00
|
|
|
^COPYING(|\.LESSER)|build-aux/syntax-check.mk$$
|
2012-07-26 22:58:02 +00:00
|
|
|
|
2014-02-26 09:25:30 +00:00
|
|
|
exclude_file_name_regexp--sc_flags_usage = \
|
2019-10-02 16:51:19 +00:00
|
|
|
^(build-aux/syntax-check\.mk|docs/|src/util/virnetdevtap\.c$$|tests/((vir(cgroup|pci|test|usb)|nss|qemuxml2argv|qemusecurity)mock|virfilewrapper)\.c$$)
|
2011-07-08 15:18:48 +00:00
|
|
|
|
2011-04-23 21:00:26 +00:00
|
|
|
exclude_file_name_regexp--sc_libvirt_unmarked_diagnostics = \
|
2012-08-20 13:06:21 +00:00
|
|
|
^(src/rpc/gendispatch\.pl$$|tests/)
|
2011-04-23 21:00:26 +00:00
|
|
|
|
2010-12-10 12:27:33 +00:00
|
|
|
exclude_file_name_regexp--sc_po_check = ^(docs/|src/rpc/gendispatch\.pl$$)
|
2011-03-16 21:25:56 +00:00
|
|
|
|
|
|
|
exclude_file_name_regexp--sc_prohibit_VIR_ERR_NO_MEMORY = \
|
2019-10-02 16:51:19 +00:00
|
|
|
^(build-aux/syntax-check\.mk|include/libvirt/virterror\.h|src/remote/remote_daemon_dispatch\.c|src/util/virerror\.c|docs/internals/oomtesting\.html\.in)$$
|
2016-04-11 15:00:26 +00:00
|
|
|
|
2019-10-02 16:04:31 +00:00
|
|
|
exclude_file_name_regexp--sc_makefile_TAB_only_indentation = \
|
2019-10-02 16:51:19 +00:00
|
|
|
^build-aux/syntax-check\.mk$$
|
2019-10-02 16:04:31 +00:00
|
|
|
|
|
|
|
exclude_file_name_regexp--sc_makefile_at_at_check = \
|
2019-10-02 16:51:19 +00:00
|
|
|
^build-aux/syntax-check\.mk$$
|
2019-10-02 16:04:31 +00:00
|
|
|
|
2016-04-11 15:00:26 +00:00
|
|
|
exclude_file_name_regexp--sc_prohibit_PATH_MAX = \
|
2019-10-02 16:51:19 +00:00
|
|
|
^build-aux/syntax-check\.mk$$
|
2011-03-16 21:25:56 +00:00
|
|
|
|
2016-04-11 15:00:26 +00:00
|
|
|
exclude_file_name_regexp--sc_prohibit_access_xok = \
|
2019-08-30 12:22:54 +00:00
|
|
|
^(src/util/virutil\.c)$$
|
2011-03-18 20:41:13 +00:00
|
|
|
|
2011-03-16 21:25:56 +00:00
|
|
|
exclude_file_name_regexp--sc_prohibit_asprintf = \
|
2019-10-02 16:51:19 +00:00
|
|
|
^(build-aux/syntax-check\.mk|bootstrap.conf$$|examples/|src/util/virstring\.[ch]$$|tests/vircgroupmock\.c|tools/virt-login-shell\.c|tools/nss/libvirt_nss\.c$$)
|
2011-04-11 22:25:25 +00:00
|
|
|
|
2013-04-04 18:16:43 +00:00
|
|
|
exclude_file_name_regexp--sc_prohibit_strdup = \
|
2019-07-31 09:40:39 +00:00
|
|
|
^(docs/|examples/|src/util/virstring\.c|tests/vir(netserverclient|cgroup)mock.c|tests/commandhelper\.c|tools/nss/libvirt_nss_(leases|macs)\.c$$)
|
2013-04-04 18:16:43 +00:00
|
|
|
|
2011-03-16 21:25:56 +00:00
|
|
|
exclude_file_name_regexp--sc_prohibit_close = \
|
2019-12-18 16:46:07 +00:00
|
|
|
(\.p[yl]$$|\.spec\.in$$|^docs/|^(src/util/vir(file|event)\.c|src/libvirt-stream\.c|tests/(vir.+mock\.c|commandhelper\.c|qemusecuritymock\.c)|tools/nss/libvirt_nss_(leases|macs)\.c)$$)
|
2011-03-16 21:25:56 +00:00
|
|
|
|
|
|
|
exclude_file_name_regexp--sc_prohibit_empty_lines_at_EOF = \
|
2018-03-28 20:46:41 +00:00
|
|
|
(^tests/(virhostcpu|virpcitest)data/|docs/js/.*\.js|docs/fonts/.*\.woff|\.diff|tests/virconfdata/no-newline\.conf$$)
|
2011-03-16 21:25:56 +00:00
|
|
|
|
2018-02-20 13:16:28 +00:00
|
|
|
_src2=src/(util/vircommand|libvirt|lxc/lxc_controller|locking/lock_daemon|logging/log_daemon|remote/remote_daemon)
|
2011-03-16 21:25:56 +00:00
|
|
|
exclude_file_name_regexp--sc_prohibit_fork_wrappers = \
|
2018-02-20 13:16:28 +00:00
|
|
|
(^($(_src2)|tests/testutils)\.c$$)
|
2011-03-16 21:25:56 +00:00
|
|
|
|
2018-02-12 10:03:08 +00:00
|
|
|
exclude_file_name_regexp--sc_prohibit_gethostname = ^src/util/vir(util|log)\.c$$
|
2011-03-16 21:25:56 +00:00
|
|
|
|
2011-09-20 18:11:32 +00:00
|
|
|
exclude_file_name_regexp--sc_prohibit_internal_functions = \
|
2012-12-13 17:44:57 +00:00
|
|
|
^src/(util/(viralloc|virutil|virfile)\.[hc]|esx/esx_vi\.c)$$
|
2011-09-20 18:11:32 +00:00
|
|
|
|
2018-04-13 14:41:17 +00:00
|
|
|
exclude_file_name_regexp--sc_prohibit_raw_virclassnew = \
|
|
|
|
^src/util/virobject\.[hc]$$
|
|
|
|
|
2011-04-23 21:00:26 +00:00
|
|
|
exclude_file_name_regexp--sc_prohibit_newline_at_end_of_diagnostic = \
|
2010-12-10 12:27:33 +00:00
|
|
|
^src/rpc/gendispatch\.pl$$
|
2011-04-23 21:00:26 +00:00
|
|
|
|
2011-03-16 21:25:56 +00:00
|
|
|
exclude_file_name_regexp--sc_prohibit_nonreentrant = \
|
tools: split virt-login-shell into two binaries
The virt-login-shell binary is a setuid program that takes
no arguments. When invoked it looks at the invoking uid,
resolves it to a username, and finds an LXC guest with the
same name. It then starts the guest and runs the shell in
side the namespaces of the container.
Given this set of tasks the virt-login-shell binary needs
to connect to libvirtd, make various other libvirt API calls.
This is a problem for setuid binaries as various libraries
that libvirt.so links to are not safe. For example, they have
constructor functions which execute an unknown amount of code
that can be influenced by env variables.
For this reason virt-login-shell doesn't use libvirt.so,
but instead links to a custom, cut down, set of source files
sufficient to be a local client only.
This introduces a problem for integrating glib2 into libvirt
though, as once integrated, there would be no way to build
virt-login-shell without an external dependancy on glib2 and
this is definitely not setuid safe.
To resolve this problem, we split the virt-login-shell binary
into two parts. The first part is setuid and does almost
nothing. It simply records the original uid+gid, and then
invokes the virt-login-shell-helper binary. Crucially when
it does this it completes scrubs all environment variables.
It is thus safe for virt-login-shell-helper to link to the
normal libvirt.so. Any things that constructor functions
do cannot be influenced by user control env vars or cli
args.
Reviewed-by: Michal Privoznik <mprivozn@redhat.com>
Signed-off-by: Daniel P. Berrangé <berrange@redhat.com>
2019-08-01 09:58:31 +00:00
|
|
|
^((po|tests|examples)/|docs/.*(py|js|html\.in)|run.in$$|tools/wireshark/util/genxdrstub\.pl|tools/virt-login-shell\.c$$)
|
2011-03-16 21:25:56 +00:00
|
|
|
|
2016-04-11 15:00:26 +00:00
|
|
|
exclude_file_name_regexp--sc_prohibit_select = \
|
2019-10-02 16:51:19 +00:00
|
|
|
^build-aux/syntax-check\.mk$$
|
2016-04-11 15:00:26 +00:00
|
|
|
|
2018-04-30 14:55:57 +00:00
|
|
|
exclude_file_name_regexp--sc_prohibit_canonicalize_file_name = \
|
2019-10-02 16:51:19 +00:00
|
|
|
^(build-aux/syntax-check\.mk|tests/virfilemock\.c)$$
|
2018-04-30 14:55:57 +00:00
|
|
|
|
2012-02-02 22:47:04 +00:00
|
|
|
exclude_file_name_regexp--sc_prohibit_raw_allocation = \
|
2019-10-02 16:04:31 +00:00
|
|
|
^(docs/hacking\.html\.in|src/util/viralloc\.[ch]|examples/.*|tests/(securityselinuxhelper|(vircgroup|nss)mock|commandhelper)\.c|tools/wireshark/src/packet-libvirt\.c|tools/nss/libvirt_nss(_leases|_macs)?\.c|build-aux/useless-if-before-free)$$
|
2012-02-02 22:47:04 +00:00
|
|
|
|
2012-05-16 15:52:44 +00:00
|
|
|
exclude_file_name_regexp--sc_prohibit_readlink = \
|
2012-12-13 17:44:57 +00:00
|
|
|
^src/(util/virutil|lxc/lxc_container)\.c$$
|
2011-03-16 21:25:56 +00:00
|
|
|
|
tools: split virt-login-shell into two binaries
The virt-login-shell binary is a setuid program that takes
no arguments. When invoked it looks at the invoking uid,
resolves it to a username, and finds an LXC guest with the
same name. It then starts the guest and runs the shell in
side the namespaces of the container.
Given this set of tasks the virt-login-shell binary needs
to connect to libvirtd, make various other libvirt API calls.
This is a problem for setuid binaries as various libraries
that libvirt.so links to are not safe. For example, they have
constructor functions which execute an unknown amount of code
that can be influenced by env variables.
For this reason virt-login-shell doesn't use libvirt.so,
but instead links to a custom, cut down, set of source files
sufficient to be a local client only.
This introduces a problem for integrating glib2 into libvirt
though, as once integrated, there would be no way to build
virt-login-shell without an external dependancy on glib2 and
this is definitely not setuid safe.
To resolve this problem, we split the virt-login-shell binary
into two parts. The first part is setuid and does almost
nothing. It simply records the original uid+gid, and then
invokes the virt-login-shell-helper binary. Crucially when
it does this it completes scrubs all environment variables.
It is thus safe for virt-login-shell-helper to link to the
normal libvirt.so. Any things that constructor functions
do cannot be influenced by user control env vars or cli
args.
Reviewed-by: Michal Privoznik <mprivozn@redhat.com>
Signed-off-by: Daniel P. Berrangé <berrange@redhat.com>
2019-08-01 09:58:31 +00:00
|
|
|
exclude_file_name_regexp--sc_prohibit_setuid = ^src/util/virutil\.c|tools/virt-login-shell\.c$$
|
2011-06-22 22:18:01 +00:00
|
|
|
|
2019-11-13 16:33:27 +00:00
|
|
|
exclude_file_name_regexp--sc_prohibit_snprintf = \
|
|
|
|
^(build-aux/syntax-check\.mk|docs/hacking\.html\.in|tools/virt-login-shell\.c)$$
|
|
|
|
|
2013-04-03 10:36:23 +00:00
|
|
|
exclude_file_name_regexp--sc_prohibit_strncpy = ^src/util/virstring\.c$$
|
2011-03-16 21:25:56 +00:00
|
|
|
|
2016-05-15 14:04:51 +00:00
|
|
|
exclude_file_name_regexp--sc_prohibit_strtol = ^examples/.*$$
|
2012-04-19 00:06:59 +00:00
|
|
|
|
2012-12-13 18:13:21 +00:00
|
|
|
exclude_file_name_regexp--sc_prohibit_xmlGetProp = ^src/util/virxml\.c$$
|
2011-03-16 21:25:56 +00:00
|
|
|
|
2012-02-24 18:48:55 +00:00
|
|
|
exclude_file_name_regexp--sc_prohibit_xmlURI = ^src/util/viruri\.c$$
|
|
|
|
|
2019-10-02 16:04:31 +00:00
|
|
|
exclude_file_name_regexp--sc_prohibit_return_as_function = \.py|build-aux/useless-if-before-free$$
|
2012-03-23 07:34:09 +00:00
|
|
|
|
2013-05-31 17:52:51 +00:00
|
|
|
exclude_file_name_regexp--sc_require_config_h = \
|
tests: fix mocking of stat() / lstat() functions
Quite a few of the tests have a need to mock the stat() / lstat()
functions and they are taking somewhat different & inconsistent
approaches none of which are actually fully correct. This is shown
by fact that 'make check' fails on 32-bit hosts. Investigation
revealed that the code was calling into the native C library impl,
not getting intercepted by our mocks.
The POSIX stat() function might resolve to any number of different
symbols in the C library.
The may be an additional stat64() function exposed by the headers
too.
On 64-bit hosts the stat & stat64 functions are identical, always
refering to the 64-bit ABI.
On 32-bit hosts they refer to the 32-bit & 64-bit ABIs respectively.
Libvirt uses _FILE_OFFSET_BITS=64 on 32-bit hosts, which causes the
C library to transparently rewrite stat() calls to be stat64() calls.
Libvirt will never see the 32-bit ABI from the traditional stat()
call. We cannot assume this rewriting is done using a macro. It might
be, but on GLibC it is done with a magic __asm__ statement to apply
the rewrite at link time instead of at preprocessing.
In GLibC there may be two additional functions exposed by the headers,
__xstat() and __xstat64(). When these exist, stat() and stat64() are
transparently rewritten to call __xstat() and __xstat64() respectively.
The former symbols will not actally exist in the library at all, only
the header. The leading "__" indicates the symbols are a private impl
detail of the C library that applications should not care about.
Unfortunately, because we are trying to mock replace the C library,
we need to know about this internal impl detail.
With all this in mind the list of functions we have to mock will depend
on several factors
- If _FILE_OFFSET_BITS is set, then we are on a 32-bit host, and we
only need to mock stat64 and __xstat64. The other stat / __xstat
functions exist, but we'll never call them so they can be ignored
for mocking.
- If _FILE_OFFSET_BITS is not set, then we are on a 64-bit host and
we should mock stat, stat64, __xstat & __xstat64. Either may be
called by app code.
- If __xstat & __xstat64 exist, then stat & stat64 will not exist
as symbols in the library, so the latter should not be mocked.
The same all applies to lstat()
These rules are complex enough that we don't want to duplicate them
across every mock file, so this centralizes all the logic in a helper
file virmockstathelper.c that should be #included when needed. The
code merely need to provide a filename rewriting callback called
virMockStatRedirect(). Optionally VIR_MOCK_STAT_HOOK can be defined
as a macro if further processing is needed inline.
Signed-off-by: Daniel P. Berrangé <berrange@redhat.com>
2019-04-01 16:47:25 +00:00
|
|
|
^(examples/|tools/virsh-edit\.c$$|tests/virmockstathelpers.c)
|
2011-03-16 21:25:56 +00:00
|
|
|
|
2013-05-31 17:52:51 +00:00
|
|
|
exclude_file_name_regexp--sc_require_config_h_first = \
|
tests: fix mocking of stat() / lstat() functions
Quite a few of the tests have a need to mock the stat() / lstat()
functions and they are taking somewhat different & inconsistent
approaches none of which are actually fully correct. This is shown
by fact that 'make check' fails on 32-bit hosts. Investigation
revealed that the code was calling into the native C library impl,
not getting intercepted by our mocks.
The POSIX stat() function might resolve to any number of different
symbols in the C library.
The may be an additional stat64() function exposed by the headers
too.
On 64-bit hosts the stat & stat64 functions are identical, always
refering to the 64-bit ABI.
On 32-bit hosts they refer to the 32-bit & 64-bit ABIs respectively.
Libvirt uses _FILE_OFFSET_BITS=64 on 32-bit hosts, which causes the
C library to transparently rewrite stat() calls to be stat64() calls.
Libvirt will never see the 32-bit ABI from the traditional stat()
call. We cannot assume this rewriting is done using a macro. It might
be, but on GLibC it is done with a magic __asm__ statement to apply
the rewrite at link time instead of at preprocessing.
In GLibC there may be two additional functions exposed by the headers,
__xstat() and __xstat64(). When these exist, stat() and stat64() are
transparently rewritten to call __xstat() and __xstat64() respectively.
The former symbols will not actally exist in the library at all, only
the header. The leading "__" indicates the symbols are a private impl
detail of the C library that applications should not care about.
Unfortunately, because we are trying to mock replace the C library,
we need to know about this internal impl detail.
With all this in mind the list of functions we have to mock will depend
on several factors
- If _FILE_OFFSET_BITS is set, then we are on a 32-bit host, and we
only need to mock stat64 and __xstat64. The other stat / __xstat
functions exist, but we'll never call them so they can be ignored
for mocking.
- If _FILE_OFFSET_BITS is not set, then we are on a 64-bit host and
we should mock stat, stat64, __xstat & __xstat64. Either may be
called by app code.
- If __xstat & __xstat64 exist, then stat & stat64 will not exist
as symbols in the library, so the latter should not be mocked.
The same all applies to lstat()
These rules are complex enough that we don't want to duplicate them
across every mock file, so this centralizes all the logic in a helper
file virmockstathelper.c that should be #included when needed. The
code merely need to provide a filename rewriting callback called
virMockStatRedirect(). Optionally VIR_MOCK_STAT_HOOK can be defined
as a macro if further processing is needed inline.
Signed-off-by: Daniel P. Berrangé <berrange@redhat.com>
2019-04-01 16:47:25 +00:00
|
|
|
^(examples/|tools/virsh-edit\.c$$|tests/virmockstathelpers.c)
|
2011-03-16 21:25:56 +00:00
|
|
|
|
2012-04-26 10:11:49 +00:00
|
|
|
exclude_file_name_regexp--sc_trailing_blank = \
|
2018-03-28 20:46:41 +00:00
|
|
|
/sysinfodata/.*\.data|/virhostcpudata/.*\.cpuinfo|^gnulib/local/.*/.*diff$$
|
2011-03-16 21:25:56 +00:00
|
|
|
|
|
|
|
exclude_file_name_regexp--sc_unmarked_diagnostics = \
|
2019-10-08 10:19:30 +00:00
|
|
|
^(scripts/apibuild.py|tests/virt-aa-helper-test|docs/js/.*\.js)$$
|
2012-03-29 09:52:04 +00:00
|
|
|
|
2019-10-02 16:51:19 +00:00
|
|
|
exclude_file_name_regexp--sc_size_of_brackets = build-aux/syntax-check\.mk
|
2011-07-06 16:20:04 +00:00
|
|
|
|
|
|
|
exclude_file_name_regexp--sc_correct_id_types = \
|
|
|
|
(^src/locking/lock_protocol.x$$)
|
Add some autoconf helper macros for checking for libraries
Most checks for libraries take the same format
* --with-libFOO=yes|no|check|/some/path argument
* check for a function NNN in libFOO.so
* check for a header file DDD/HHH.h
* Define a WITH_FOO config.h symbol
* Define a WITH_FOO make conditional
* Substitute FOO_CFLAGS and FOO_LIBS make variables
* Print CFLAGS & LIBS summary at the end
Doing all this correctly is rather difficult, typically
done by copy+paste of a previous usage. Further small
improvements people make are not applied to all previous
usages.
Improve this by creating some helper macros to apply
good practice. First, to perform the actual checks:
LIBVIRT_CHECK_LIB([SELINUX], [selinux],
[getfilecon], [selinux/selinux.h])
This checks for 'getfilecon' in -lselinux, and the
existence of 'selinux/selinux.h' header file. If successful
it sets SELINUX_CFLAGS and SELINUX_LIBS. The WITH_SELINUX
config.h macro and WITH_SELINUX make conditional are also
defined.
In some cases we need to check two variants of the same
library
LIBVIRT_CHECK_LIB_ALT([SASL], [sasl2],
[sasl_client_init], [sasl/sasl.h],
[SASL1], [sasl],
[sasl_client_init], [sasl/sasl.h])
This checks for sasl_client_init in libsasl2, and if that
is not found, checks sasl_client_init in libsasl. If the
first check succeeds WITH_SASL is set, while if the second
check succeeds *both* WITH_SASL and WITH_SASL1 are set.
If the library supports pkg-config, then another variant
is available
LIBVIRT_CHECK_PKG([AVAHI], [avahi-client], [0.6.0])
This checks for avahi-client >= 0.6.0 via pkg-config
and sets WITH_AVAHI if found.
Finally to print a summary of CFLAGS & LIBs found (if any):
LIBVIRT_RESULT_LIB([SELINUX])
Signed-off-by: Daniel P. Berrange <berrange@redhat.com>
2012-09-19 17:46:30 +00:00
|
|
|
|
|
|
|
exclude_file_name_regexp--sc_m4_quote_check = m4/virt-lib.m4
|
2013-04-17 10:19:18 +00:00
|
|
|
|
2013-04-17 10:19:19 +00:00
|
|
|
exclude_file_name_regexp--sc_prohibit_include_public_headers_quote = \
|
2019-02-08 08:54:40 +00:00
|
|
|
^(src/internal\.h$$|tools/wireshark/src/packet-libvirt.c$$)
|
2013-04-17 10:19:19 +00:00
|
|
|
|
|
|
|
exclude_file_name_regexp--sc_prohibit_include_public_headers_brackets = \
|
2015-11-26 14:02:49 +00:00
|
|
|
^(tools/|examples/|include/libvirt/(virterror|libvirt(-(admin|qemu|lxc))?)\.h$$)
|
2013-07-08 14:17:29 +00:00
|
|
|
|
|
|
|
exclude_file_name_regexp--sc_prohibit_int_ijk = \
|
2019-10-02 16:51:19 +00:00
|
|
|
^(src/remote_protocol-structs|src/remote/remote_protocol\.x|build-aux/syntax-check\.mk|include/libvirt/libvirt.+|src/admin_protocol-structs|src/admin/admin_protocol\.x)$$
|
2013-10-09 10:19:27 +00:00
|
|
|
|
2016-10-06 14:54:41 +00:00
|
|
|
exclude_file_name_regexp--sc_prohibit_unsigned_pid = \
|
|
|
|
^(include/libvirt/.*\.h|src/(qemu/qemu_driver\.c|driver-hypervisor\.h|libvirt(-[a-z]*)?\.c|.*\.x|util/vir(polkit|systemd)\.c)|tests/virpolkittest\.c|tools/virsh-domain\.c)$$
|
|
|
|
|
2019-10-14 13:02:40 +00:00
|
|
|
exclude_file_name_regexp--sc_avoid_g_gnuc_unused_in_header = \
|
2015-04-27 11:25:51 +00:00
|
|
|
^(src/util/virlog\.h|src/network/bridge_driver\.h)$$
|
2014-03-13 12:00:16 +00:00
|
|
|
|
|
|
|
exclude_file_name_regexp--sc_prohibit_mixed_case_abbreviations = \
|
|
|
|
^src/(vbox/vbox_CAPI.*.h|esx/esx_vi.(c|h)|esx/esx_storage_backend_iscsi.c)$$
|
2014-03-18 10:29:12 +00:00
|
|
|
|
|
|
|
exclude_file_name_regexp--sc_prohibit_empty_first_line = \
|
2018-02-21 12:51:32 +00:00
|
|
|
^(README|src/esx/README|tests/(vmwarever|virhostcpu)data/.*)$$
|
2014-09-10 13:52:48 +00:00
|
|
|
|
|
|
|
exclude_file_name_regexp--sc_prohibit_useless_translation = \
|
|
|
|
^tests/virpolkittest.c
|
2014-10-01 14:07:46 +00:00
|
|
|
|
|
|
|
exclude_file_name_regexp--sc_prohibit_devname = \
|
2019-10-02 16:51:19 +00:00
|
|
|
^(tools/virsh.pod|build-aux/syntax-check\.mk|docs/.*)$$
|
2014-11-30 14:57:02 +00:00
|
|
|
|
|
|
|
exclude_file_name_regexp--sc_prohibit_virXXXFree = \
|
2019-10-02 16:51:19 +00:00
|
|
|
^(docs/|tests/|examples/|tools/|build-aux/syntax-check\.mk|src/test/test_driver.c|src/libvirt_public.syms|include/libvirt/libvirt-(domain|network|nodedev|storage|stream|secret|nwfilter|interface|domain-snapshot).h|src/libvirt-(domain|qemu|network|nodedev|storage|stream|secret|nwfilter|interface|domain-snapshot).c$$)
|
2015-02-02 10:26:49 +00:00
|
|
|
|
|
|
|
exclude_file_name_regexp--sc_prohibit_sysconf_pagesize = \
|
2020-01-08 13:54:17 +00:00
|
|
|
^(build-aux/syntax-check\.mk|src/util/vir(hostmem|util)\.c)$$
|
2015-03-20 15:25:15 +00:00
|
|
|
|
|
|
|
exclude_file_name_regexp--sc_prohibit_pthread_create = \
|
2019-10-02 16:51:19 +00:00
|
|
|
^(build-aux/syntax-check\.mk|src/util/virthread\.c|tests/.*)$$
|
2015-10-20 16:15:12 +00:00
|
|
|
|
virtestmock: Mock stat() properly
There is a lot to explain, but I try to make it as short as
possible. I'd start by pasting some parts of sys/stat.h:
extern int stat (const char *__restrict __file,
struct stat *__restrict __buf) __THROW __nonnull ((1, 2));
extern int __REDIRECT_NTH (stat, (const char *__restrict __file,
struct stat *__restrict __buf), stat64)
__nonnull ((1, 2));
__extern_inline int
__NTH (stat (const char *__path, struct stat *__statbuf))
{
return __xstat (_STAT_VER, __path, __statbuf);
}
Only one of these is effective at once, due to some usage of
the mess we are dealing with in here. So, basically, while
compiling or linking stat() in our code can be transformed into
some other func. Or a dragon.
Now, if you read stat(2) manpage, esp. "C library/kernel
differences" section, you'll learn that glibc uses some tricks
for older applications to work. I haven't gotten around actual
code that does this, but based on my observations, if 'stat'
symbol is found, glibc assumes it's dealing with ancient
application. Unfortunately, it can be just ours stat coming from
our mock. Therefore, calling stat() from a test will end up in
our mock. But since glibc is not exposing the symbol anymore, our
call of real_stat() will SIGSEGV immediately as the pointer to
function is NULL. Therefore, we should expose only those symbols
we know glibc has.
Signed-off-by: Michal Privoznik <mprivozn@redhat.com>
2016-05-17 14:26:53 +00:00
|
|
|
exclude_file_name_regexp--sc_prohibit_always-defined_macros = \
|
|
|
|
^tests/virtestmock.c$$
|
2016-06-21 14:53:42 +00:00
|
|
|
|
|
|
|
exclude_file_name_regexp--sc_prohibit_readdir = \
|
2019-07-30 14:33:20 +00:00
|
|
|
^(tests/(.*mock|virfilewrapper)\.c|tools/nss/libvirt_nss\.c)$$
|
2017-02-20 13:54:12 +00:00
|
|
|
|
|
|
|
exclude_file_name_regexp--sc_prohibit_cross_inclusion = \
|
|
|
|
^(src/util/virclosecallbacks\.h|src/util/virhostdev\.h)$$
|
2019-04-02 12:33:06 +00:00
|
|
|
|
|
|
|
exclude_file_name_regexp--sc_prohibit_dirent_d_type = \
|
|
|
|
^(src/util/vircgroup.c)$
|
2019-08-08 09:23:26 +00:00
|
|
|
|
|
|
|
exclude_file_name_regexp--sc_prohibit_strcmp = \
|
2019-09-27 16:18:24 +00:00
|
|
|
^(tools/nss/libvirt_nss.*\.c|tools/virt-login-shell\.c)
|
2019-10-02 16:04:31 +00:00
|
|
|
|
|
|
|
exclude_file_name_regexp--sc_prohibit_backslash_alignment = \
|
2019-10-02 16:51:19 +00:00
|
|
|
^build-aux/syntax-check\.mk$$
|
2020-01-07 16:19:52 +00:00
|
|
|
|
|
|
|
exclude_file_name_regexp--sc_prohibit_always_true_header_tests = \
|
|
|
|
^src/util/virfile\.c$$
|