"std::_debug_memset" не объявлен
Я работаю над GCC119 из фермы компиляции. Это AIX 7.1, POWER8 с IBM XLC 13.1. Я пытаюсь использовать отладочную кучу:
gcc119$ cat test.cxx
#include <altivec.h>
#undef vector
#undef pixel
#undef bool
#include <cstdlib>
int main(int argc, char* argv[])
{
unsigned char x[32];
std::memset(x, 0x00, 32);
return 0;
}
Результат компиляции:
gcc119$ xlC -DDEBUG -g3 -O0 -qheapdebug -qro test.cxx -o test.exe
"test.cxx", line 11.3: 1540-0130 (S) "std::_debug_memset" is not declared.
И то и другое <cstring>
а также <string.h>
привести к ошибке. Я также пытался в том числе <cstdlib>
а также <stdlib.h>
и они привели к той же ошибке.
Руководство по оптимизации и программированию содержит хорошее обсуждение функций отладки памяти, но рассматривается только язык C. Похоже, это не относится к C++.
Как использовать кучу отладки в программе на C++?
gcc119$ oslevel -s
7200-00-01-1543
gcc119$ xlC -qversion
IBM XL C/C++ for AIX, V13.1.3 (5725-C72, 5765-J07)
Version: 13.01.0003.0004
2 ответа
Основываясь на наблюдении @user10688376, вот что я придумала. Я думаю, что это технически неопределенное поведение, потому что мне не разрешено ставить такие символы, как _debug_memset
а также _debug_memcpy
в std
Пространство имен. На этом этапе потенциальный UB лучше, чем неудачная компиляция и отсутствие тестирования.
#if defined(_AIX) && (defined(__xlc__) || defined(__xlC__) || defined(__ibmxl__))
# if defined(__DEBUG_ALLOC__)
namespace std {
using ::_debug_memset;
using ::_debug_memcpy;
}
# endif
#endif
_AIX
используется, потому что он идентифицирует операционную систему. Кучи отладки недоступны в Linux. (Некоторые компиляторы IBM XLC также работают на Linux).
__xlc__
а также __xlC__
используются для обнаружения компилятора IBM XLC 13.0 и более ранних версий. Этот компилятор полностью создан IBM.
__ibmxl__
используется для обнаружения компилятора IBM XLC 13.1 и новее Этот компилятор использует внешний интерфейс Clang и внутренний интерфейс IBM. Я думаю, что это компилятор "LLC", упомянутый в обзоре LLVM 21078.
__DEBUG_ALLOC__
используется, потому что компилятор устанавливает его для -qheapdebug
,
Вы должны попробовать в том числе <string.h>
вместо этого и используя неквалифицированную memset
, Согласно Руководству по программированию IBM XL C/C++, _debug_memset
живет в string.h
, Таким образом, вопрос становится, не должен <cstring>
сделать его доступным через std::
? В справочнике по стандартной библиотеке IBM XL C/C++ он показывает все объявления об использовании, а функции отладки там нет.
namespace std
{
using ::size_t; using ::memcmp; using ::memcpy; using ::memmove;
using ::memset; using ::strcat; using ::strcmp; using ::strcoll;
using ::strcpy; using ::strcspn; using ::strerror; using ::strlen;
using ::strncat; using ::strncmp; using ::strncpy; using ::strspn;
using ::strtok; using ::strxfrm;
}