1
0
mirror of https://git.savannah.gnu.org/git/gnulib.git synced 2026-10-24 00:48:56 +03:00
Files
gnulib/tests/test-strerror.c
Bruno Haible 88592a2880 strerror: Detect invalid writes to the returned string in some cases.
* lib/string.in.h (strerror): Change the return type to 'const char *'.
(GNULIB_defined_strerror): New macro.
* lib/strerror.c (strerror): Change the return type to 'const char *'.
* lib/strerror_l.c (errno_string_callback): Change a variable from
'char *' to 'const char *'.
* lib/strerror_r.c (strerror_r): Likewise.
* doc/posix-functions/strerror.texi: Document that Gnulib uses the
return type 'const char *'.
* NEWS: Mention the change.
* m4/perror.m4 (gl_FUNC_PERROR): Change a variable from 'char *' to
'const char *'.
* m4/strerror.m4 (gl_FUNC_STRERROR_0): Likewise.
* m4/strerror_r.m4 (gl_FUNC_STRERROR_R_WORKS): Likewise.
* tests/test-strerror.c (strerror): Update expected signature.
(main): Change a variable from 'char *' to 'const char *'.
* tests/test-string-h-c++.cc (GNULIB_NAMESPACE::strerror): Update
expected signature.
2026-06-08 16:10:42 +02:00

80 lines
2.1 KiB
C

/* Test of strerror() function.
Copyright (C) 2007-2026 Free Software Foundation, Inc.
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3, or (at your option)
any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, see <https://www.gnu.org/licenses/>. */
/* Written by Eric Blake <ebb9@byu.net>, 2007. */
#include <config.h>
#include <string.h>
#include "signature.h"
#if GNULIB_defined_strerror
SIGNATURE_CHECK (strerror, const char *, (int));
#else
SIGNATURE_CHECK (strerror, char *, (int));
#endif
#include <errno.h>
#include "macros.h"
int
main (void)
{
const char *str;
errno = 0;
str = strerror (EACCES);
ASSERT (str);
ASSERT (*str);
ASSERT (errno == 0);
errno = 0;
str = strerror (ETIMEDOUT);
ASSERT (str);
ASSERT (*str);
ASSERT (errno == 0);
errno = 0;
str = strerror (EOVERFLOW);
ASSERT (str);
ASSERT (*str);
ASSERT (errno == 0);
/* POSIX requires strerror (0) to succeed. Reject use of "Unknown
error", but allow "Success", "No error", or even Solaris' "Error
0" which are distinct patterns from true out-of-range strings.
https://austingroupbugs.net/view.php?id=382 */
errno = 0;
str = strerror (0);
ASSERT (str);
ASSERT (*str);
ASSERT (errno == 0);
ASSERT (strstr (str, "nknown") == NULL);
ASSERT (strstr (str, "ndefined") == NULL);
/* POSIX requires strerror to produce a non-NULL result for all
inputs; as an extension, we also guarantee a non-empty result.
Reporting EINVAL is optional. */
errno = 0;
str = strerror (-3);
ASSERT (str);
ASSERT (*str);
ASSERT (errno == 0 || errno == EINVAL);
return test_exit_status;
}