[Date Prev][Date Next]
[Chronological]
[Thread]
[Top]
Re: (ITS#3839) pedantic and format troubles
h.b.furuseth@usit.uio.no wrote:
> Full_Name: Hallvard B Furuseth Version: HEAD OS: URL: Submission
> from: (NULL) (129.240.186.42) Submitted by: hallvard
>
>
> gcc -pedantic -Wformat -Wno-format-extra-args isn't nice to the
> config stuff:
>
> ===
>
> ConfigTable.arg_item is set to (void*)integer or (void*)function when
> arg_type & (ARG_MAGIC | ARG_OFFSET). This is not portable - function
> and void pointers may have different sizes, or pointers may be
> normalized in some way after being assigned integers, etc.
I feel this concern is unwarranted for a number of reasons:
1) re int vs pointer - any supposed normalization must be reversible.
We are not converting integers to pointers or vice versa; that is, we do
not store an integer and later attempt to use it as a pointer. As such,
if the value we read from this variable is not the same as the value we
stored, the compiler is broken.
2) there is a large body of code that depends on the
interchangeability of function pointers and object pointers, thanks to
APIs like dlsym() and friends.
http://www.opengroup.org/onlinepubs/009695399/functions/dlsym.html
The fact that this stuff still works tells me no problem exists. When
these things stop working, then there's a legitimate issue to fix.
> This should either be replaced with 3 fields (where only one is set
> per table entry), or the current field could be set to a pointer to a
> variable containg the current value.
Feel free to replace this with a union if you wish. I don't see the need
but also there's no harm if you make this change.
> Um. And I guess it's about time to fix the same problem with
> ldap_pvt_thread_pool_<setkey/getkey>(). They receive function
> pointers sometimes. I'll create some static variables to hold these
> function pointers, and pass them pointers to those variables instead.
Don't bother to preserve the function pointers. The only point in those
calls is to pass a unique value to distinguish one key from another. It
is of no interest whether the function pointer is passed *intact* so
long as it is passed *consistently* in each invocation, so that the same
value is propagated. The passed pointers are never dereferenced. If you
don't like using function pointers here, just pass some other unique
value instead.
> ===
>
> ConfigArgs.lineno is an unsigned long, but a number of routines that
> can report line numbers (like parse_acl) take an int. So do a lot of
> printf formats. I started to fix the formats that are wrong, but
> maybe it's just as well to use int lineno.
I agree, an int is probably sufficient.
> A ligher change is
> to make the char* file/mode args to ldif_open() LDAP_CONST, since
> they are passed const char*'s from elsewhere.
fine.
> ===
>
> Two plain bugs in bconfig.c: Message "%s: (optional) %s overlay
> \"%s\" configuration failed" gets the char c->argv[1][1] instead of
> c->argv[1]+1 or something.
>
> Message "<%s> cannot be deleted" gets no arg to the %s. Looks like it
> should be deleted, since it's repeated below.
OK.
--
-- Howard Chu
Chief Architect, Symas Corp. Director, Highland Sun
http://www.symas.com http://highlandsun.com/hyc
Symas: Premier OpenSource Development and Support