threads / patch / 31877

patchgrep: remove tautological check

Subject: [PATCH] grep: remove tautological check

## tl;dr

3 messages between Oct 20, 2012 and Oct 22, 2012. Diffs are folded; open one to read it.

replies: 2people: 2as markdown or json

David Soria Parra· Oct 20, 2012, 17:26 UTC · lore

The enum grep_header_field is unsigned. Therefore the field part of the grep_pat structure is unsigned and cannot be less then 0. We remove the tautological check for p->field < 0.

Signed-off-by: David Soria Parra <dsp@php.net>
---
 grep.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
Show changes to grep.c +1 −1
diff --git a/grep.c b/grep.c
index 4bd1b8b..db177ef 100644
--- a/grep.c
+++ b/grep.c
@@ -625,7 +625,7 @@ static struct grep_expr *prep_header_patterns(struct grep_opt *opt)
 	for (p = opt->header_list; p; p = p->next) {
 		if (p->token != GREP_PATTERN_HEAD)
 			die("bug: a non-header pattern in grep header list.");
-		if (p->field < 0 || GREP_HEADER_FIELD_MAX <= p->field)
+		if (GREP_HEADER_FIELD_MAX <= p->field)
 			die("bug: unknown header field %d", p->field);
 		compile_regexp(p, opt);
 	}
-- 
1.8.0.rc3.332.g181c802
Peter Krefting· Oct 20, 2012, 19:23 UTC · re: David Soria Parra · lore

Re: [PATCH] grep: remove tautological check

David Soria Parra:
> The enum grep_header_field is unsigned.

Enumerations can be either unsigned or signed, it is up to the compiler to decide. Even if you assign only positive number to named enumeration values, there are compilers that make them signed. I've been bitten by that enough.

-- 
\\// Peter - http://www.softwolves.pp.se/
Peter Krefting· Oct 22, 2012, 13:20 UTC · re: David Soria Parra · lore

Re: [PATCH] grep: remove tautological check

David Soria Parra:
> -		if (p->field < 0 || GREP_HEADER_FIELD_MAX <= p->field)
> +		if (GREP_HEADER_FIELD_MAX <= p->field)

A friend taught me this trick, which will check that it isn't negative for compilers that have the enumeration be signed (notably MSVC), while not complaining for compilers that have it unsigned (GCC, Clang):

   const unsigned int sign = 1u << (sizeof(p->field) * CHAR_BIT - 1);
   if (!(sign & (unsigned int) p->field) || GREP_HEADER_FIELD_MAX <= p->field)
-- 
\\// Peter - http://www.softwolves.pp.se/

← back to recent threads