Node:Function Portability, Next:Particular Functions, Up:Library Functions
Most usual functions can either be missing, or be buggy, or be limited on some architectures. This section tries to make an inventory of these portability issues. By definition, this list will always require additions. Please help us keeping it as complete as possible.
snprintf
snprintf
and vsnprintf
truncate
the output and return the number of bytes that ought to have been
produced. Some older systems return the truncated length (e.g., GNU C
Library 2.0.x or IRIX 6.5), some a negative value (e.g., earlier GNU C
Library versions), and some the buffer length without truncation (e.g.,
32-bit Solaris 7). Also, some buggy older systems ignore the length and
overrun the buffer (e.g., 64-bit Solaris 7).
sprintf
sprintf
and vsprintf
return the
number of bytes written, but on some old systems (SunOS 4 for
instance) they return the buffer pointer instead.
sscanf
sscanf
requires that its
input string is writable (though it doesn't actually change it). This
can be a problem when using gcc
since it normally puts
constant strings in read-only memory
(see Incompatibilities of GCC). Apparently in some cases even
having format strings read-only can be a problem.
strnlen
strnlen ("foobar", 0) = 0 strnlen ("foobar", 1) = 3 strnlen ("foobar", 2) = 2 strnlen ("foobar", 3) = 1 strnlen ("foobar", 4) = 0 strnlen ("foobar", 5) = 6 strnlen ("foobar", 6) = 6 strnlen ("foobar", 7) = 6 strnlen ("foobar", 8) = 6 strnlen ("foobar", 9) = 6
unlink
unlink
causes the given files to be
removed only after there are no more open file handles for it. Not all
OS's support this behaviour though. So even on systems that provide
unlink
, you cannot portably assume it is OK to call it on files
that are open. For example, on Windows 9x and ME, such a call would fail;
on DOS it could even lead to file system corruption, as the file might end
up being written to after the OS has removed it.
va_copy
va_copy
for copying
va_list
variables. It may be available in older environments
too, though possibly as __va_copy
(eg. gcc
in strict
C89 mode). These can be tested with #ifdef
. A fallback to
memcpy (&dst, &src, sizeof(va_list))
will give maximum
portability.
va_list
va_list
is not necessarily just a pointer. It can be a
struct
(eg. gcc
on Alpha), which means NULL
is
not portable. Or it can be an array (eg. gcc
in some
PowerPC configurations), which means as a function parameter it can be
effectively call-by-reference and library routines might modify the
value back in the caller (eg. vsnprintf
in the GNU C Library
2.1).
>>
>>
right shift of a signed type replicates the
high bit, giving a so-called "arithmetic" shift. But care should be
taken since the ISO C standard doesn't require that behaviour. On those
few processors without a native arithmetic shift (for instance Cray
vector systems) zero bits may be shifted in, the same as a shift of an
unsigned type.