From f808810d00b9ffa955fc106e0ffd91606193c601 Mon Sep 17 00:00:00 2001 From: Sergey Bugaev Date: Tue, 25 Aug 2020 17:48:52 +0300 Subject: [PATCH] LibC: Deprecate strcpy(), strncpy(), strcat() and strncat() :^) And also mark strlcpy() and strlcat() with __attribute__((warn_unused_result)). Since our code is warning-free, this ensures we never misuse those functions. (Or are very sure about doing it when turning off the warning for a particular piece of code.) --- Libraries/LibC/string.h | 19 ++++++++++++++++--- Libraries/LibC/termcap.cpp | 7 +++++++ .../elf-symbolication-kernel-read-exploit.cpp | 2 ++ 3 files changed, 25 insertions(+), 3 deletions(-) diff --git a/Libraries/LibC/string.h b/Libraries/LibC/string.h index aea83cb2a4..e2fffa90c2 100644 --- a/Libraries/LibC/string.h +++ b/Libraries/LibC/string.h @@ -33,27 +33,40 @@ __BEGIN_DECLS size_t strlen(const char*); size_t strnlen(const char*, size_t maxlen); + int strcmp(const char*, const char*); int strncmp(const char*, const char*, size_t); +int strcasecmp(const char*, const char*); +int strncasecmp(const char*, const char*, size_t); + int memcmp(const void*, const void*, size_t); void* memcpy(void*, const void*, size_t); void* memmove(void*, const void*, size_t); void* memchr(const void*, int c, size_t); const void* memmem(const void* haystack, size_t, const void* needle, size_t); + void bzero(void*, size_t); void bcopy(const void*, void*, size_t); void* memset(void*, int, size_t); + __attribute__((malloc)) char* strdup(const char*); __attribute__((malloc)) char* strndup(const char*, size_t); + +__attribute__((deprecated("use strlcpy or String::copy_characters_to_buffer"))) char* strcpy(char* dest, const char* src); -size_t strlcpy(char* dest, const char* src, size_t); +__attribute__((deprecated("use strlcpy or String::copy_characters_to_buffer"))) char* strncpy(char* dest, const char* src, size_t); +__attribute__((warn_unused_result)) size_t strlcpy(char* dest, const char* src, size_t); + char* strchr(const char*, int c); char* strchrnul(const char*, int c); char* strstr(const char* haystack, const char* needle); char* strrchr(const char*, int c); -char* strcat(char* dest, const char* src); -char* strncat(char* dest, const char* src, size_t); + +__attribute__((deprecated("use strlcat"))) char* strcat(char* dest, const char* src); +__attribute__((deprecated("use strlcat"))) char* strncat(char* dest, const char* src, size_t); +__attribute__((warn_unused_result)) size_t strlcat(char* dest, const char* src, size_t); + size_t strspn(const char*, const char* accept); size_t strcspn(const char*, const char* reject); char* strerror(int errnum); diff --git a/Libraries/LibC/termcap.cpp b/Libraries/LibC/termcap.cpp index 9e2b0047c6..370919688e 100644 --- a/Libraries/LibC/termcap.cpp +++ b/Libraries/LibC/termcap.cpp @@ -95,6 +95,11 @@ static void ensure_caps() caps->set("li", "25"); } +// Unfortunately, tgetstr() doesn't accept a size argument for the buffer +// pointed to by area, so we have to use bare strcpy(). +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wdeprecated-declarations" + char* tgetstr(const char* id, char** area) { ensure_caps(); @@ -113,6 +118,8 @@ char* tgetstr(const char* id, char** area) return nullptr; } +#pragma GCC diagnostic pop + int tgetflag(const char* id) { (void)id; diff --git a/Userland/Tests/Kernel/elf-symbolication-kernel-read-exploit.cpp b/Userland/Tests/Kernel/elf-symbolication-kernel-read-exploit.cpp index 3f44b0446d..d4ccbf1ac6 100644 --- a/Userland/Tests/Kernel/elf-symbolication-kernel-read-exploit.cpp +++ b/Userland/Tests/Kernel/elf-symbolication-kernel-read-exploit.cpp @@ -37,6 +37,8 @@ asm("haxcode:\n" extern "C" void haxcode(); extern "C" void haxcode_end(); +#pragma GCC diagnostic ignored "-Wdeprecated-declarations" + int main() { char buffer[16384];