"std :: _ debug_memset" не объявлен - PullRequest
       42

"std :: _ debug_memset" не объявлен

0 голосов
/ 22 ноября 2018

Я работаю над 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 ]

0 голосов
/ 22 ноября 2018

Основываясь на наблюдении @ 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 Review 21078 .

__DEBUG_ALLOC__ используется, потому что компилятор устанавливает его для -qheapdebug.

0 голосов
/ 22 ноября 2018

Вместо этого попробуйте включить <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;
}
...