What Not to Use
STL – it is totally incomprehensible.
Also, please don’t use:
strcpy()
strcat()
strncpy()
strncat();
sprintf()
snprintf()
They are system dependent and un-safe. These should be replaced by the Bacula safe equivalents:
char *bstrncpy(char *dest, char *source, int dest_size);
char *bstrncat(char *dest, char *source, int dest_size);
int bsnprintf(char *buf, int32_t buf_len, const char *fmt, ...);
int bvsnprintf(char *str, int32_t size, const char *format, va_list ap);
See src/lib/bsys.c
for more details on these routines.
Don’t use the %lld or the %q printf format editing types to edit 64 bit integers – they are not portable. Instead, use %s with edit_uint64(). For example:
char buf[100];
uint64_t num = something;
char ed1[50];
bsnprintf(buf, sizeof(buf), "Num=%s\n", edit_uint64(num, ed1));
Note: %lld is now permitted in Bacula code – we have our own printf
routines which handle it correctly. The edit_uint64()
subroutine can
still be used if you wish, but over time, most of that old style will be
removed.
The edit buffer ed1 must be at least 27 bytes long to avoid
overflow. See src/lib/edit.c
for more details. If you look at the
code, don’t start screaming that I use lld. I actually use subtle
trick taught to me by John Walker. The lld that appears in the
editing routine is actually #define to a what is needed on your OS
(usually “lld
” or “q
”) and is defined in
autoconf/configure.in
for each OS. C
string concatenation causes
the appropriate string to be concatenated to the “%”.
Also please don’t use the STL or Templates or any complicated C++
code.
Possible Next Steps
Go to Avoid if Possible.
Go back to Developer Notes.
Go back to Developer Guide.