This is the mail archive of the
glibc-bugs@sourceware.org
mailing list for the glibc project.
[Bug libc/12204] New: glibc does has no POSIX compliant strerror_r function
- From: "bruno at clisp dot org" <sourceware-bugzilla at sourceware dot org>
- To: glibc-bugs at sources dot redhat dot com
- Date: Tue, 9 Nov 2010 23:14:40 +0000
- Subject: [Bug libc/12204] New: glibc does has no POSIX compliant strerror_r function
- Auto-submitted: auto-generated
http://sourceware.org/bugzilla/show_bug.cgi?id=12204
Summary: glibc does has no POSIX compliant strerror_r function
Product: glibc
Version: 2.8
Status: NEW
Severity: normal
Priority: P2
Component: libc
AssignedTo: drepper.fsp@gmail.com
ReportedBy: bruno@clisp.org
glibc has two strerror_r functions, declared in <string.h> depending on
feature macros. But none of them is POSIX compliant.
The one which is in effect when _GNU_SOURCE=1 has the declaration
char *strerror_r (int, char *, size_t). It has a different return type
and therefore a different calling convention than the POSIX function.
Test case:
=================================================
#define _GNU_SOURCE 1
#include <string.h>
#include <stdio.h>
int main()
{
char buf[100];
char *s = strerror_r (-2, buf, sizeof (buf));
printf ("result: %s\n", s);
return 0;
}
=================================================
The one which is in effect when _GNU_SOURCE is undefined and
_POSIX_C_SOURCE=200112L has the declaration
int strerror_r (int, char *, size_t), which is POSIX compatible,
but it has a different return value convention in case of failure.
POSIX:2001 and POSIX:2008 say that in case of failure the strerror_r
function should return "an error number"; this is the same wording
as for pthread_create, pthread_mutex_lock, etc. However, the glibc
function returns -1 and sets errno to the error number instead.
Test case:
========================================================================
#define _POSIX_C_SOURCE 200112L
#include <string.h>
#include <errno.h>
#include <stdio.h>
int main()
{
char buf[100] = "______";
int r;
r = strerror_r (-2, buf, sizeof (buf));
if (r == 0)
printf ("result: success %s\n", buf);
else if (r > 0)
printf ("result: failure %d %s\n", r, buf);
else
printf ("result: non-POSIX failure %d %d %s\n", r, errno, buf);
r = strerror_r (EACCES, buf, 3);
if (r == 0)
printf ("result: success %s\n", buf);
else if (r > 0)
printf ("result: failure %d %s\n", r, buf);
else
printf ("result: non-POSIX failure %d %d %s\n", r, errno, buf);
return 0;
}
==========================================================================
Expected result:
result: failure 22 ______
result: failure 34 ______
Actual result:
result: non-POSIX failure -1 22 ______
result: non-POSIX failure -1 34 ______
--
Configure bugmail: http://sourceware.org/bugzilla/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
You are on the CC list for the bug.