|
HP C++
HP C++ Using HP C++ for Tru64 UNIX and Linux
Alpha
Appendix C Third Degree Messages
This appendix describes Third Degree messages generated by the C++
Class and Standard Libraries. None of the following messages contribute
to memory corruption in programs or cause memory depletion in long
running applications.
- Third degree 576 byte leak and 16 byte leak messages from
__init_cxx_exc
When you instrument a HP C++ program with Third degree, the
tool might generate 576 byte leak and 16 byte leak messages like the
following from the Class Library routine
__init_cxx_exe
:
576 bytes in 1 leak created at:
malloc libc.so
pc = 0x3ff81d35c04 libcxx.so
pc = 0x3ff81d35e20 libcxx.so
__init_cxx_exc libcxx.so
16 bytes in 1 leak (including 1 super leak) created at:
malloc libc.so
pc = 0x3ff81d35c04 libcxx.so
pc = 0x3ff81d35ca4 libcxx.so
pc = 0x3ff81d35dfc libcxx.so
__init_cxx_exc libcxx.so
|
A program like the following would generate the previous messages:
These two leaks are generated by the C++ exception handling code.
This storage is memory allocated to process exception handling during
program startup and is deleted by the operating system when the program
exits. Third degree reports a leak because the operating system, rather
than C++ code, deletes the storage. The operating system deletes this
storage for these reasons:
- The compiler does not slow down exit for all C++ programs.
- After the program terminates, the compiler verifies that no
additional C++ exceptions need handling.
- Third degree 8/24/48 byte leak messages from
__init_cxx_exc
When you instrument a HP C++ program with Third degree, the
tool might generate four 8, four 24, and four 48 byte leak messages
like the following from the Class Library routine
__init_cxx_exe
:
48 bytes in 1 leak created at:
malloc libc.so
__cma_tis_mutex_create libc.so
AllocateInternalMutex(void) libcxx.so
Mutex::Mutex(void) libcxx.so
Iostream_init::initialize(void) libcxx.so
Iostream_init::Iostream_init(void) libcxx.so
__init_cxxl_init142DB80C libcxx.so
24 bytes in 1 leak created at:
operator new(unsigned long) libcxx.so
AllocateInternalMutex(void) libcxx.so
Mutex::Mutex(void) libcxx.so
Iostream_init::initialize(void) libcxx.so
Iostream_init::Iostream_init(void) libcxx.so
__init_cxxl_init142DB80C libcxx.so
8 bytes in 1 leak (including 1 super leak) created at:
operator new(unsigned long) libcxx.so
Iostream_init::initialize(void) libcxx.so
Iostream_init::Iostream_init(void) libcxx.so
__init_cxxl_init142DB80C libcxx.so
|
A program like the following would generate the previous messages:
The messages originate from the creation of Class Library Iostream
mutexes for
cin
,
cout
,
clog
, and
cerr
, which are created at program startup. The operating system cleans up
the memory rather than deleting it at program exit from C++.
- Additional Third degree 48/24 byte leak messages from
__init_cxx_exc
When you instrument a HP C++ program with Third degree, the
tool might generate an additional 24 and 48 byte leak messages like the
following from the Class Library routine
__init_cxx_exe
:
48 bytes in 1 leak created at:
malloc libc.so
__cma_tis_mutex_create libc.so
AllocateInternalMutex(void) libcxx.so
Mutex::Mutex(void) libcxx.so
Iostream_init::Iostream_init(void) libcxx.so
__init_cxxl_init142DB80C libcxx.so
24 bytes in 1 leak created at:
operator new(unsigned long) libcxx.so
AllocateInternalMutex(void) libcxx.so
Mutex::Mutex(void) libcxx.so
Iostream_init::Iostream_init(void) libcxx.so
__init_cxxl_init142DB80C libcxx.so
|
A program like the following would generate the previous messages:
The messages also come from a mutex used in Iostream locking; they
are created at program startup and are cleaned up by the operating
system rather than being deleting at program exit by C++.
- Third degree 48 byte leak messages from
__init_cxxl_initxxxxxxxx
When you instrument a HP C++ program with Third degree, the
tool might generate an additional 48 byte leak message like the
following from the Class Library routine
__init_cxxl_initxxxxxxxx
:
48 bytes in 1 leak (including 1 super leak) created at:
malloc libc.so
__cma_tis_mutex_create libc.so
pc = 0x3ff81d3a46c libcxx.so
__cma_tis_once libc.so
__cxx_test_and_set_atomic libcxx.so
__init_cxxl_init142DB80C libcxx.so
|
A program like the following would generate the previous message:
This message comes from the mutex used to initialize the Class
Library; the mutex is created at program startup and is deleted by the
operating system rather than by C++ code at program exit.
- Third degree
fon
warning message from
__init_cxx_exe
When you instrument a C++ program with Third degree, the tool might
generate a
fon
warning like the following from the C++ Class Library routine
__init_cxx_exe
:
------------------------------------------------ fon -- 0 --
calling free(0)
free fon
pc = 0x120068090 fon
__init_cxx_exc fon
--------------------------------------------------------------
|
A program like the following would generate the previous message:
The message, freeing a NULL pointer, is only a warning. In this
case, the library does in fact free a NULL pointer, but this is valid
behavior. You can ignore the message.
- Third degree
wis
error from
__vec_new_eh
When you instrument a C++ program with Third degree, the tool might
generate a
wis
error like the following from the C++ Standard Library routine
__vec_new_eh
:
------------------------------------------------ wis -- 1 --
wis.cxx: 5: writing invalid stack at byte 64 of 64 in frame of
array_new_general
(void*, int, unsigned long, void*, void (*)(void*, int), void*
(*)(unsigned long),
void (*)(void*), int, int, unsigned int)
array_new_general(void*, int, unsigned long, void*, void (*)(void*,
int), void*
(*)(unsigned long), void (*)(void*), int, int, unsigned int)
wis
__vec_new_eh wis
--------------------------------------------------------------
|
A program like the following would generate the previous message:
struct C {C() {};};
int main () {
C* pc = new C[5];
delete []pc;
return 0;
}
|
Programs using
global array new
can generate the message when Third degree encounters a special
scheduling instruction. This false positive message has been reported
to Third degree.
- Third degree
rin
error message
The following error message is generated in programs
that use exception handling in the Class Library. This false positive
message has been reported to Third degree.
rin.c: 7: reading invalid stack at byte 656 of 656 in frame of main
proc_at_0x12000e350 rin
__exc_virtual_unwind rin
exc_virtual_unwind rin
main rin, rin.c, line 7
__start rin
|
- Third degree might report false positive uninitiated memory errors
As of Atom 2.47, Third degree might report false positive
uninitiated memory errors where variables of less than 32 bits are
involved. Note that
bool
data types, which the Standard Library uses extensively, fall into this
category. For example, when you instrument a C++ program with Third
degree, the tool might generate a
rus
error with Atom version 2.47 in the STL map class. The error would be
generated by a program like the following:
#include <map>
main() {
map <int, int> the_test_map;
the_test_map[1] = 1;
the_test_map[2] = 2;
}
|
The following is an example of a small, self-contained program
(reduced from the above program) that generates the same error.
struct tree
{
bool b;
void init () {;}
tree(const int i = 3, bool b = true) : b(b)
{
init();
}
};
void main() {
tree t;
}
|
|