This is an automated email from the ASF dual-hosted git repository. hartmannathan pushed a commit to branch strtod-fixes in repository https://gitbox.apache.org/repos/asf/incubator-nuttx.git
commit 1d803dd7a81a09097cd0dee66ef396ad55452457 Author: Nathan Hartman <59230071+hartmannat...@users.noreply.github.com> AuthorDate: Mon Aug 29 16:53:36 2022 -0400 libc: Port strtod fixes to strtof, strtold and improve comments * libs/libc/stdlib/lib_strtod.c: (strtod): Add a note about limitations of this implementation as compared to POSIX in the function's docstring. Also fix a typo. * libs/libc/stdlib/lib_strtof.c: (strtof): Port the changes made to strtod in PR-6952 (commit c83985c5ce7) and add same note as above to docstring. * libs/libc/stdlib/lib_strtold.c: (strtold): Same changes as strtof. --- libs/libc/stdlib/lib_strtod.c | 6 +++++- libs/libc/stdlib/lib_strtof.c | 15 ++++++++++++++- libs/libc/stdlib/lib_strtold.c | 15 ++++++++++++++- 3 files changed, 33 insertions(+), 3 deletions(-) diff --git a/libs/libc/stdlib/lib_strtod.c b/libs/libc/stdlib/lib_strtod.c index 358eb5aec2..fe8e48ff4b 100644 --- a/libs/libc/stdlib/lib_strtod.c +++ b/libs/libc/stdlib/lib_strtod.c @@ -79,12 +79,16 @@ static inline int is_real(double x) * Public Functions ****************************************************************************/ -/***************************************************(************************ +/**************************************************************************** * Name: strtod * * Description: * Convert a string to a double value * + * NOTE: This implementation is limited as compared to POSIX: + * - Hexadecimal input is not supported + * - INF, INFINITY, NAN, and NAN(...) are not supported + * ****************************************************************************/ double strtod(FAR const char *str, FAR char **endptr) diff --git a/libs/libc/stdlib/lib_strtof.c b/libs/libc/stdlib/lib_strtof.c index 246a5183ad..176a5c5333 100644 --- a/libs/libc/stdlib/lib_strtof.c +++ b/libs/libc/stdlib/lib_strtof.c @@ -86,12 +86,16 @@ static inline int is_real(float x) * Public Functions ****************************************************************************/ -/***************************************************(************************ +/**************************************************************************** * Name: strtof * * Description: * Convert a string to a float value * + * NOTE: This implementation is limited as compared to POSIX: + * - Hexadecimal input is not supported + * - INF, INFINITY, NAN, and NAN(...) are not supported + * ****************************************************************************/ float strtof(FAR const char *str, FAR char **endptr) @@ -173,6 +177,7 @@ float strtof(FAR const char *str, FAR char **endptr) { set_errno(ERANGE); number = 0.0F; + p = (FAR char *)str; goto errout; } @@ -208,6 +213,14 @@ float strtof(FAR const char *str, FAR char **endptr) /* Process string of digits */ + if (!isdigit(*p)) + { + set_errno(ERANGE); + number = 0.0F; + p = (FAR char *)str; + goto errout; + } + n = 0; while (isdigit(*p)) { diff --git a/libs/libc/stdlib/lib_strtold.c b/libs/libc/stdlib/lib_strtold.c index 322685f699..cd569561d2 100644 --- a/libs/libc/stdlib/lib_strtold.c +++ b/libs/libc/stdlib/lib_strtold.c @@ -79,12 +79,16 @@ static inline int is_real(long double x) * Public Functions ****************************************************************************/ -/***************************************************(************************ +/**************************************************************************** * Name: strtold * * Description: * Convert a string to a long double value * + * NOTE: This implementation is limited as compared to POSIX: + * - Hexadecimal input is not supported + * - INF, INFINITY, NAN, and NAN(...) are not supported + * ****************************************************************************/ long double strtold(FAR const char *str, FAR char **endptr) @@ -160,6 +164,7 @@ long double strtold(FAR const char *str, FAR char **endptr) { set_errno(ERANGE); number = 0.0L; + p = (FAR char *)str; goto errout; } @@ -195,6 +200,14 @@ long double strtold(FAR const char *str, FAR char **endptr) /* Process string of digits */ + if (!isdigit(*p)) + { + set_errno(ERANGE); + number = 0.0L; + p = (FAR char *)str; + goto errout; + } + n = 0; while (isdigit(*p)) {