"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;
}
Другие вопросы по тегам