Solaris 11.2: Functional Deprecation
- by alanc
In Solaris 11.1,
I updated the system headers to enable use of several attributes on
functions, including noreturn and printf format, to give
compilers and static analyzers more information about how they are used to
give better warnings when building code.
In Solaris 11.2, I've gone back in and added one more attribute to
a number of functions in the system headers:
__attribute__((__deprecated__)). This is used to warn people
building software that they’re using function calls we recommend
no longer be used. While in many cases the
Solaris Binary Compatibility Guarantee means we won't ever remove
these functions from the system libraries, we still want to discourage
their use.
I made passes through both the POSIX and C
standards, and some of the Solaris architecture review cases to come up with
an initial list which the Solaris architecture review committee accepted to
start with. This set is by no means a complete list of Obsolete function
interfaces, but should be a reasonable start at functions that are well
documented as deprecated and seem useful to warn developers away from.
More functions may be flagged in the future as they get deprecated, or if
further passes are made through our existing deprecated functions to flag
more of them.
Header
Interface
Deprecated by
Alternative
Documented in
<door.h>
door_cred(3C)
PSARC/2002/188
door_ucred(3C)
door_cred(3C)
<kvm.h>
kvm_read(3KVM), kvm_write(3KVM)
PSARC/1995/186
Functions on kvm_kread(3KVM) man page
kvm_read(3KVM)
<stdio.h>
gets(3C)
ISO C99 TC3 (Removed in ISO C11), POSIX:2008/XPG7/Unix08
fgets(3C)
gets(3C) man page, and just about every gets(3C) reference online from the past 25 years, since the Morris worm proved bad things happen when it’s used.
<unistd.h>
vfork(2)
PSARC/2004/760, POSIX:2001/XPG6/Unix03 (Removed in POSIX:2008/XPG7/Unix08)
posix_spawn(3C)
vfork(2) man page.
<utmp.h>
All functions from getutent(3C) man page
PSARC/1999/103
utmpx functions from getutentx(3C) man page
getutent(3C) man page
<varargs.h>
varargs.h version of va_list typedef
ANSI/ISO C89 standard
<stdarg.h>
varargs(3EXT)
<volmgt.h>
All functions
PSARC/2005/672
hal(5) API
volmgt_check(3VOLMGT), etc.
<sys/nvpair.h>
nvlist_add_boolean(3NVPAIR), nvlist_lookup_boolean(3NVPAIR)
PSARC/2003/587
nvlist_add_boolean_value, nvlist_lookup_boolean_value
nvlist_add_boolean(3NVPAIR) & (9F), nvlist_lookup_boolean(3NVPAIR) & (9F).
<sys/processor.h>
gethomelgroup(3C)
PSARC/2003/034
lgrp_home(3LGRP)
gethomelgroup(3C)
<sys/stat_impl.h>
_fxstat, _xstat, _lxstat, _xmknod
PSARC/2009/657
stat(2)
old functions are undocumented remains of SVR3/COFF compatibility support
If the above table is cut off when viewing in the blog, try viewing this standalone copy of the table.
To See or Not To See
To see these warnings, you will need to be building with either gcc
(versions 3.4, 4.5, 4.7, & 4.8 are available in the 11.2 package repo),
or with Oracle Solaris Studio 12.4 or later (which like Solaris 11.2, is
currently in beta testing).
For instance, take this oversimplified (and obviously buggy) implementation of
the cat command:
#include <stdio.h>
int main(int argc, char **argv) {
char buf[80];
while (gets(buf) != NULL)
puts(buf);
return 0;
}
Compiling it with the Studio 12.4 beta compiler will produce warnings such as:
% cc -V
cc: Sun C 5.13 SunOS_i386 Beta 2014/03/11
% cc gets_test.c
"gets_test.c", line 6: warning: "gets" is deprecated, declared in : "/usr/include/iso/stdio_iso.h", line 221
The exact warning given varies by compilers, and the compilers also have a
variety of flags to either raise the warnings to errors, or silence them.
Of couse, the exact form of the output is Not An Interface that can
be relied on for automated parsing, just shown for example.
gets(3C) is actually a special case — as noted above, it is no
longer part of the C Standard Library in the C11 standard, so when compiling in
C11 mode (i.e. when __STDC_VERSION__ >= 201112L), the
<stdio.h> header will not provide a prototype for it, causing
the compiler to complain it is unknown:
% gcc -std=c11 gets_test.c
gets_test.c: In function ‘main’:
gets_test.c:6:5: warning: implicit declaration of function ‘gets’ [-Wimplicit-function-declaration]
while (gets(buf) != NULL)
^
The gets(3C) function of course is still in libc, so if you ignore the
error or provide your own prototype, you can still build code that calls it,
you just have to acknowledge you’re taking on the risk of doing so yourself.
Solaris Studio 12.4 Beta
% cc gets_test.c
"gets_test.c", line 6: warning: "gets" is deprecated, declared in : "/usr/include/iso/stdio_iso.h", line 221
% cc -errwarn=E_DEPRECATED_ATT gets_test.c
"gets_test.c", line 6: "gets" is deprecated, declared in : "/usr/include/iso/stdio_iso.h", line 221
cc: acomp failed for gets_test.c
This warning is silenced in the 12.4 beta by cc -erroff=E_DEPRECATED_ATT
No warning is currently issued by Studio 12.3 & earler releases.
gcc 3.4.3
% /usr/sfw/bin/gcc gets_test.c
gets_test.c: In function `main':
gets_test.c:6: warning: `gets' is deprecated (declared at /usr/include/iso/stdio_iso.h:221)
Warning is completely silenced with gcc -Wno-deprecated-declarations
gcc 4.7.3
% /usr/gcc/4.7/bin/gcc gets_test.c
gets_test.c: In function ‘main’:
gets_test.c:6:5: warning: ‘gets’ is deprecated (declared at /usr/include/iso/stdio_iso.h:221) [-Wdeprecated-declarations]
% /usr/gcc/4.7/bin/gcc -Werror=deprecated-declarations gets_test.c
gets_test.c: In function ‘main’:
gets_test.c:6:5: error: ‘gets’ is deprecated (declared at /usr/include/iso/stdio_iso.h:221) [-Werror=deprecated-declarations]
cc1: some warnings being treated as errors
Warning is completely silenced with gcc -Wno-deprecated-declarations
gcc 4.8.2
% /usr/bin/gcc gets_test.c
gets_test.c: In function ‘main’:
gets_test.c:6:5: warning: ‘gets’ is deprecated (declared at /usr/include/iso/stdio_iso.h:221) [-Wdeprecated-declarations]
while (gets(buf) != NULL)
^
% /usr/bin/gcc -Werror=deprecated-declarations gets_test.c
gets_test.c: In function ‘main’:
gets_test.c:6:5: error: ‘gets’ is deprecated (declared at /usr/include/iso/stdio_iso.h:221) [-Werror=deprecated-declarations]
while (gets(buf) != NULL)
^
cc1: some warnings being treated as errors
Warning is completely silenced with gcc -Wno-deprecated-declarations