Follow @Openwall on Twitter for new release announcements and other news
[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Date: Wed, 6 Nov 2013 11:36:40 -0500
From: Rich Felker <>
Subject: Re: [PATCH v2] shadow: Implement putspent

On Wed, Nov 06, 2013 at 02:20:54PM +0100, Jens Gustedt wrote:
> Hi Rich,
> Am Dienstag, den 05.11.2013, 18:31 -0500 schrieb Rich Felker:
> > While it doesn't really matter in this file, in general, macro
> > arguments should be properly parenthesized, as in:
> > +#define NUM(n) ((n) == -1 ? 0 : -1), ((n) == -1 ? 0 : (n))
> for such a macro that is replacing two function arguments, I'd go for
> a much more descriptive name, something like NUM2ARGS

I agree with you in principle, but I don't think it really matters
here. The file is small enough that you see both the definition and
usage together. A better improvement might be adding a comment that
the macro expands to two arguments to fprintf, a precision and a
value, but we're getting well into bikeshed territory here. :-)

> > +#define STR(s) ((s) ? (s) : "")
> in the context of the actual function that would certainly overkill,
> but generally it is not a good idea to mix user strings and string
> literals without consting them. So in a general context I'd go for
> something like
> #define STR(S) ((char const*)((S) ? (S) : ""))
> or even
> #define STR(S) ((S) ? (char const*){ (S) } : "")
> to have a better type check for the argument

I disagree with this change. The type of string literals is char *,
not const char *, so it's not a type consistency issue. Even if it
were, the ?: operator handles the type correctly anyway. My view is
that casts are a code smell, and no-op casts are harmful in that they
obfuscate the correctness of types (since the reader has to question
whether the cast is hiding a type mismatch).


Powered by blists - more mailing lists

Confused about mailing lists and their use? Read about mailing lists on Wikipedia and check out these guidelines on proper formatting of your messages.