History log of /seL4-camkes-master/projects/musllibc/include/string.h
Revision Date Author Comments
# c8a9c221 24-Nov-2013 Rich Felker <dalias@aerifal.cx>

restore type of NULL to void * except when used in C++ programs

unfortunately this eliminates the ability of the compiler to diagnose
some dangerous/incorrect usage, but POSIX requires (as an extension to
the C language, i.e. CX shaded) that NULL have type void *. plain C
allows it to be defined as any null pointer constant.

the definition 0L is preserved for C++ rather than reverting to plain
0 to avoid dangerous behavior in non-conforming programs which use
NULL as a variadic sentinel. (it's impossible to use (void *)0 for C++
since C++ lacks the proper implicit pointer conversions, and other
popular alternatives like the GCC __null extension seem non-conforming
to the standard's requirements.)


# 41d7c77d 18-Jan-2013 Rich Felker <dalias@aerifal.cx>

use a common definition of NULL as 0L for C and C++

the historical mess of having different definitions for C and C++
comes from the historical C definition as (void *)0 and the fact that
(void *)0 can't be used in C++ because it does not convert to other
pointer types implicitly. however, using plain 0 in C++ exposed bugs
in C++ programs that call variadic functions with NULL as an argument
and (wrongly; this is UB) expect it to arrive as a null pointer. on
64-bit machines, the high bits end up containing junk. glibc dodges
the issue by using a GCC extension __null to define NULL; this is
observably non-conforming because a conforming application could
observe the definition of NULL via stringizing and see that it is
neither an integer constant expression with value zero nor such an
expression cast to void.

switching to 0L eliminates the issue and provides compatibility with
broken applications, since on all musl targets, long and pointers have
the same size, representation, and argument-passing convention. we
could maintain separate C and C++ definitions of NULL (i.e. just use
0L on C++ and use (void *)0 on C) but after careful analysis, it seems
extremely difficult for a C program to even determine whether NULL has
integer or pointer type, much less depend in subtle, unintentional
ways, on whether it does. C89 seems to have no way to make the
distinction. on C99, the fact that (int)(void *)0 is not an integer
constant expression, along with subtle VLA/sizeof semantics, can be
used to make the distinction, but many compilers are non-conforming
and give the wrong result to this test anyway. on C11, _Generic can
trivially make the distinction, but it seems unlikely that code
targetting C11 would be so backwards in caring which definition of
NULL an implementation uses.

as such, the simplest path of using the same definition for NULL in
both C and C++ was chosen. the #undef directive was also removed so
that the compiler can catch and give a warning or error on
redefinition if buggy programs have defined their own versions of
NULL prior to inclusion of standard headers.


# 769fd4ce 03-Dec-2012 Rich Felker <dalias@aerifal.cx>

feature test macros: make _GNU_SOURCE enable everything

previously, a few BSD features were enabled only by _BSD_SOURCE, not
by _GNU_SOURCE. since _BSD_SOURCE is default in the absence of other
feature test macros, this made adding _GNU_SOURCE to a project not a
purely additive feature test macro; it actually caused some features
to be suppressed.

most of the changes made by this patch actually bring musl in closer
alignment with the glibc behavior for _GNU_SOURCE. the only exceptions
are the added visibility of functions like strlcpy which were BSD-only
due to being disliked/rejected by glibc maintainers. here, I feel the
consistency of having _GNU_SOURCE mean "everything", and especially
the property of it being purely additive, are more valuable than
hiding functions which glibc does not have.


# c86f2974 15-Oct-2012 Rich Felker <dalias@aerifal.cx>

add memmem function (gnu extension)

based on strstr. passes gnulib tests and a few quick checks of my own.


# e2f6a325 13-Sep-2012 Rich Felker <dalias@aerifal.cx>

strsep is BSD|GNU, not GNU-only; it's originally from BSD


# c1a9658b 07-Sep-2012 Rich Felker <dalias@aerifal.cx>

default features: make musl usable without feature test macros

the old behavior of exposing nothing except plain ISO C can be
obtained by defining __STRICT_ANSI__ or using a compiler option (such
as -std=c99) that predefines it. the new default featureset is POSIX
with XSI plus _BSD_SOURCE. any explicit feature test macros will
inhibit the default.

installation docs have also been updated to reflect this change.


# 400c5e5c 06-Sep-2012 Rich Felker <dalias@aerifal.cx>

use restrict everywhere it's required by c99 and/or posix 2008

to deal with the fact that the public headers may be used with pre-c99
compilers, __restrict is used in place of restrict, and defined
appropriately for any supported compiler. we also avoid the form
[restrict] since older versions of gcc rejected it due to a bug in the
original c99 standard, and instead use the form *restrict.


# 419ae6d5 22-May-2012 Rich Felker <dalias@aerifal.cx>

support _BSD_SOURCE feature test macro

patch by Isaac Dunham. matched closely (maybe not exact) to glibc's
idea of what _BSD_SOURCE should make visible.


# 37bb3cce 09-May-2012 Rich Felker <dalias@aerifal.cx>

omit declaration of basename wrongly interpreted as prototype in C++

the non-prototype declaration of basename in string.h is an ugly
compromise to avoid breaking 2 types of broken software:

1. programs which assume basename is declared in string.h and thus
would suffer from dangerous pointer-truncation if an implicit
declaration were used.

2. programs which include string.h with _GNU_SOURCE defined but then
declare their own prototype for basename using the incorrect GNU
signature for the function (which would clash with a correct
prototype).

however, since C++ does not have non-prototype declarations and
interprets them as prototypes for a function with no arguments, we
must omit it when compiling C++ code. thankfully, all known broken
apps that suffer from the above issues are written in C, not C++.


# 06aec8d7 24-Feb-2012 Rich Felker <dalias@aerifal.cx>

replace prototype for basename in string.h with non-prototype declaration

GNU programs may expect the GNU version of basename, which has a
different prototype (argument is const-qualified) and prototype it
themselves too. of course if they're expecting the GNU behavior for
the function, they'll still run into problems, but at least this
eliminates some compile-time failures.


# 1ba28b90 07-Feb-2012 Rich Felker <dalias@aerifal.cx>

declare basename in string.h when _GNU_SOURCE is defined

note that it still will have the standards-conformant behavior, not
the GNU behavior. but at least this prevents broken code from ending
up with truncated pointers due to implicit declarations...


# 36bf5694 06-Feb-2012 Rich Felker <dalias@aerifal.cx>

more locale_t interfaces (string stuff) and header updates

this should be everything except for some functions where the non-_l
version isn't even implemented yet (mainly some non-ISO-C wcs*
functions).


# a6540174 11-Sep-2011 Rich Felker <dalias@aerifal.cx>

add dummied strverscmp (obnoxious GNU function)

programs that use this tend to horribly botch international text
support, so it's questionable whether we want to support it even in
the long term... for now, it's just a dummy that calls strcmp.


# b5b41212 25-Apr-2011 Rich Felker <dalias@aerifal.cx>

function signature fix: add const qualifier to mempcpy src arg


# 32e2c468 26-Apr-2011 Rich Felker <dalias@aerifal.cx>

typo in prototype for mempcpy


# d179807f 26-Apr-2011 Rich Felker <dalias@aerifal.cx>

prototype for mempcpy


# 6597f9ac 13-Apr-2011 Rich Felker <dalias@aerifal.cx>

implement memrchr (nonstandard) and optimize strrchr in terms of it


# 1fee6186 06-Apr-2011 Rich Felker <dalias@aerifal.cx>

fix prototype for strsep


# a5323c57 30-Mar-2011 Rich Felker <dalias@aerifal.cx>

add some missing prototypes for nonstandard functions (strsep, clearenv)


# 2a195dd3 26-Feb-2011 Rich Felker <dalias@aerifal.cx>

fix missing prototype for strsignal


# 73d310e1 23-Feb-2011 Rich Felker <dalias@aerifal.cx>

apply feature test protection to memccpy


# 26f35514 15-Feb-2011 Rich Felker <dalias@aerifal.cx>

prototype for gnu strcasestr (currently a stub)


# ca1aa5ba 14-Feb-2011 Rich Felker <dalias@aerifal.cx>

more header cleanup and conformance fixes - string.h


# 0b44a031 11-Feb-2011 Rich Felker <dalias@aerifal.cx>

initial check-in, version 0.5.0