未声明“ std :: _ debug_memset”

时间:2018-11-21 23:11:38

标签: c++ aix memset xlc

我正在通过编译场处理GCC119。该机器是带有IBM XLC 13.1的AIX 7.1,POWER8。我正在尝试使用调试堆:

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>,它们导致相同的错误。

Optimization and Programming Guide手册对调试内存功能进行了很好的讨论,但处理方式仅是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 :(得分:1)

您应该尝试包括<string.h>并使用不合格的memset。根据{{​​3}},_debug_memset生活在string.h中。因此问题就来了,<cstring>是否应该通过std::使其可用?在IBM XL C/C++ Programming Guide中,它显示所有正在使用的声明,而调试功能不存在。

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;
}

答案 1 :(得分:1)

基于@ 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后端。我认为这是LLVM Review 21078中提到的“ LLC”编译器。

使用

__DEBUG_ALLOC__是因为编译器将其设置为-qheapdebug