[libvirt] [PATCH] build: prohibit cross-inclusion

Daniel P. Berrange berrange at redhat.com
Fri Mar 2 10:01:34 UTC 2012


On Thu, Mar 01, 2012 at 05:40:19PM -0700, Eric Blake wrote:
> Make it easier to detect invalid cross-directory includes, by
> adding a syntax check.  The check is designed to be extensible:
> the default case lists only the non-driver directories, and
> specific directories can list a different set (for example,
> util/ can only use itself, network/ can only use itself, util/,
> or conf/).
> 
> * .gnulib: Update to latest, for syntax check improvment.
> * cfg.mk (sc_prohibit_cross_inclusion): New check.
> (sc_prohibit_strncmp, sc_libvirt_unmarked_diagnostics): Simplify.
> ---
> 
> * .gnulib b856fad...44de969 (31):
>   > maint.mk: avoid spurious failure of _sc_search_regexp-using tests
>   > maint.mk: add per-line exclusions to prohibitions
>   > Tests for module 'expl-ieee'.
>   > New module 'expl-ieee'.
>   > Tests for module 'exp-ieee'.
>   > New module 'exp-ieee'.
>   > Tests for module 'expf-ieee'.
>   > New module 'expf-ieee'.
>   > cbrtl-ieee: Work around test failure on IRIX 6.5.
>   > Tests for module 'cbrtl-ieee'.
>   > New module 'cbrtl-ieee'.
>   > Tests for module 'cbrt-ieee'.
>   > New module 'cbrt-ieee'.
>   > Tests for module 'cbrtf-ieee'.
>   > New module 'cbrtf-ieee'.
>   > cbrtf: Work around bug in IRIX 6.5 system function.
>   > Tests for module 'cbrtl'.
>   > New module 'cbrtl'.
>   > Tests for module 'cbrtf'.
>   > New module 'cbrtf'.
>   > cbrt: Provide replacement on MSVC and Minix.
>   > hypotl-ieee: Work around test failure on OSF/1 and native Windows.
>   > hypotf-ieee: Work around test failure on OSF/1 and native Windows.
>   > hypot-ieee: Work around test failure on OSF/1 and native Windows.
>   > Tests for module 'hypotl-ieee'.
>   > New module 'hypotl-ieee'.
>   > Tests for module 'hypot-ieee'.
>   > New module 'hypot-ieee'.
>   > Tests for module 'hypotf-ieee'.
>   > New module 'hypotf-ieee'.
>   > Remove unused variables.
> 
>  .gnulib |    2 +-
>  cfg.mk  |   38 ++++++++++++++++++++++++++++----------
>  2 files changed, 29 insertions(+), 11 deletions(-)
> 
> diff --git a/.gnulib b/.gnulib
> index b856fad..44de969 160000
> --- a/.gnulib
> +++ b/.gnulib
> @@ -1 +1 @@
> -Subproject commit b856fadc1c8dcb53e7efcbb2d0ae7edc022fdb6a
> +Subproject commit 44de969cd62abbfe3e7cc7641a8dea7673fd2d6d
> diff --git a/cfg.mk b/cfg.mk
> index ac6c527..95994df 100644
> --- a/cfg.mk
> +++ b/cfg.mk
> @@ -348,11 +348,10 @@ sc_prohibit_access_xok:
>  # Use STREQLEN or STRPREFIX rather than comparing strncmp == 0, or != 0.
>  snp_ = strncmp *\(.+\)
>  sc_prohibit_strncmp:
> -	@grep -nE '! *strncmp *\(|\<$(snp_) *[!=]=|[!=]= *$(snp_)'	\
> -	    $$($(VC_LIST_EXCEPT))					\
> -	  | grep -vE ':# *define STR(N?EQLEN|PREFIX)\(' &&		\
> -	  { echo '$(ME): use STREQLEN or STRPREFIX instead of str''ncmp' \
> -		1>&2; exit 1; } || :
> +	@prohibit='! *strncmp *\(|\<$(snp_) *[!=]=|[!=]= *$(snp_)'	\
> +	exclude=':# *define STR(N?EQLEN|PREFIX)\('			\
> +	halt='$(ME): use STREQLEN or STRPREFIX instead of str''ncmp'	\
> +	  $(_sc_search_regexp)
> 
>  # Use virAsprintf rather than as'printf since *strp is undefined on error.
>  sc_prohibit_asprintf:
> @@ -569,11 +568,10 @@ func_re := ($(func_or))
>  #    _("...: "
>  #    "%s", _("no storage vol w..."
>  sc_libvirt_unmarked_diagnostics:
> -	@grep -nE							\
> -	    '\<$(func_re) *\([^"]*"[^"]*[a-z]{3}' $$($(VC_LIST_EXCEPT))	\
> -	  | grep -v '_''(' &&						\
> -	  { echo '$(ME): found unmarked diagnostic(s)' 1>&2;		\
> -	    exit 1; } || :
> +	@prohibit='\<$(func_re) *\([^"]*"[^"]*[a-z]{3}'			\
> +	exclude='_\('							\
> +	halt='$(ME): found unmarked diagnostic(s)'			\
> +	  $(_sc_search_regexp)
>  	@{ grep     -nE '\<$(func_re) *\(.*;$$' $$($(VC_LIST_EXCEPT));   \
>  	   grep -A1 -nE '\<$(func_re) *\(.*,$$' $$($(VC_LIST_EXCEPT)); } \
>  	   | sed 's/_("[^"][^"]*"//;s/[	 ]"%s"//'			\
> @@ -624,6 +622,26 @@ sc_prohibit_gettext_markup:
>  	halt='do not mark these strings for translation'		\
>  	  $(_sc_search_regexp)
> 
> +# 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)))
> +sc_prohibit_cross_inclusion:
> +	@for dir in $(cross_dirs); do					\
> +	  case $$dir in							\
> +	    util/) safe="util";;					\
> +	    cpu/ | locking/ | network/ | rpc/ | security/)		\
> +	      safe="($$dir|util|conf)";;				\
> +	    xenapi/ | xenxs/ ) safe="($$dir|util|conf|xen)";;		\
> +	    *) safe="($$dir|util|conf|cpu|network|locking|rpc|security)";; \
> +	  esac;								\
> +	  in_vc_files="^src/$$dir"					\
> +	  prohibit='^# *include .$(cross_dirs_re)'			\
> +	  exclude="# *include .$$safe"					\
> +	  halt='unsafe cross-directory include'				\
> +	    $(_sc_search_regexp)					\
> +	done
> +
>  # 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:

ACK this looks good to me


Daniel
-- 
|: http://berrange.com      -o-    http://www.flickr.com/photos/dberrange/ :|
|: http://libvirt.org              -o-             http://virt-manager.org :|
|: http://autobuild.org       -o-         http://search.cpan.org/~danberr/ :|
|: http://entangle-photo.org       -o-       http://live.gnome.org/gtk-vnc :|




More information about the libvir-list mailing list