我正在通过编译场处理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
答案 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
。