xxxxxx_s()-Funktionen

In einigen Libraries fehlen ein paar Funktionen, die dort laut Doku eigentlich vorhanden sein sollten.

Konkrett, auf einem RHEL 2.6.32-504.3.3.el6.x86_64 mit der GCC 4.9.2 waren die memcpy_s(), strcpy_s(), strncpy_s() und einige andere Funktionen nicht in den Bibliotheken enthalten.

Sie können jedoch wie folgt selbst nachgebaut werden:

#include <memory.h>
#include <errno.h>
typedef error_t errno_t;
inline errno_t memcpy_s(void *dest, size_t numberOfElements, const void *src, size_t count) { if (!dest) return EINVAL; memset(dest, 0, sizeof(char)); if (!src) return EINVAL; if (numberOfElements < count) return ERANGE; memcpy(dest, src, count); return 0; }
 
template <size_t size>
inline errno_t strcpy_s(char (&dest)[size], const char *src) { size_t srcLen = 0; if (!dest) return EINVAL; dest[0] = '\0'; if (!src) return EINVAL; srcLen = strlen(src); if (size < srcLen + 1) return ERANGE; strncpy(dest, src, size); dest[srcLen] = '\0'; return 0; }
 
inline errno_t strncpy_s(char *dest, size_t numberOfElements, const char *src, size_t count) { if (!dest) return EINVAL; if (numberOfElements == 0) return EINVAL; dest[0] = '\0'; if (!src) return EINVAL; if (numberOfElements < count + 1) return ERANGE; strncpy(dest, src, count); dest[count] = '\0'; return 0; }

:!: Achtung!
Diese Implementierung entspricht nicht 100% den ofiziellen Quellen und nur als Workaround zu betrachten!
Insbesondere es wird kein Handler für ungültige Parameter aufgerufen, was bei den Originalfunktionen der Fall wäre!


Stand: 21.06.2016
: Jürgen Kreick

EOF