time_t definition

Lowell Gilbert freebsd-questions-local at be-well.ilk.org
Thu Jan 17 14:24:35 UTC 2013


Polytropon <freebsd at edvax.de> writes:

> On Wed, 16 Jan 2013 10:21:03 -0800, Michael Sierchio wrote:
>> Top posting for brevity - the fact is, the code in your original
>> example is wrong.  There are reasons to complain about argument size
>> mismatches, esp. in print functions that call (versions of) malloc.
>> You should cast the time_t value explicitly, or use %d instead of %ld.
>
> This advice looks correct. If you use the source Luke,
> you'll find the following (taken from a 8.2-STABLE/i386
> system source tree):
>
> /usr/src/sys/sys/types.h (line 253):
>
> 	typedef __time_t time_t;
>
> /usr/src/sys/i386/include/_types.h (line 97):
>
> 	typedef __int32_t __time_t;
>
> /usr/src/sys/i386/include/_types.h (line 55):
>
> 	typedef int __int32_t;
>
> So it boils down to (int), but %ld expects (long). This
> is the exact content of the warning. You can either
> case the (time_t) value to (long), or change %ld to %d
> to avoid the warning.

Even if the representations boil down to the same thing, the cast is
still a good idea. You may *know* (for example) that time_t is really an
int, but you don't know that it always will be. printf() (like other
variadic functions) loses type information, so make *sure* you cast the
type to what the format says it is, because the Usual Arithmetic
Conversions cannot come in to save your bacon if (when) you're wrong.


More information about the freebsd-questions mailing list