Solaris 11.2: Functional Deprecation
Posted
by alanc
on Oracle Blogs
See other posts from Oracle Blogs
or by alanc
Published on Tue, 10 Jun 2014 03:11:35 +0000
Indexed on
2014/06/10
9:34 UTC
Read the original article
Hit count: 314
/Solaris
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.cThis 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
© Oracle Blogs or respective owner