HP C/aC++ Version 6 Features to Improve Developer Productivity

10
You can combine +check=bounds:[pointer|all] with all other +check options, except for
+check=globals (which would be ignored in this case).
Also see the +check=malloc and the +check=stack options for related runtime checks for heap
and stack objects.
+check=globals
This option enables runtime checks to detect corruption of global variables, by introducing and
checking "guards" between them, at the time of program exit. Setting environment variable
RTC_ROUTINE_LEVEL_CHECK will also enable the check whenever a function compiled with this
option returns.
For this purpose, the definition of global is extended to be all variables that have static storage
duration, including file or namespace scope variables, function scope static variables, and class (or
template class) static data members.
+check=lock
This option enables checking of C and C++ user applications that use pthreads. The option reports
violations of locking discipline when appropriate locks are not held while accessing shared data by
different threads. The check is based on the lockset method for detecting locking discipline
violations, as described in the Eraser tool article at http://citeseer.ist.psu.edu/savage97eraser.html
.
Note that +check=all does not enable +check=lock. Also note that because +check=lock
requires instrumenting each memory access; it can result in a considerable slowdown of the
application at runtime. +check=lock also increases the memory consumption of the instrumented
application.
The check is performed on each memory access. It detects violations in locking discipline for mutual
exclusion locks (mutexes) for applications using posix threads. When the locking discipline is
violated, it is reported along with the line number and the address for which the violation occurs.
Consider the following code example:
#include <stdio.h>
#include <unistd.h>
#include <pthread.h>
unsigned long things_done=0;
pthread_mutex_t mutex1 = PTHREAD_MUTEX_INITIALIZER;
pthread_mutex_t mutex2 = PTHREAD_MUTEX_INITIALIZER;
void *thread1(void *arg) {
pthread_mutex_lock(&mutex1);
things_done++;
pthread_mutex_unlock(&mutex1);
return 0;
}
void *thread2(void *arg) {
pthread_mutex_lock(&mutex2);
things_done++;
pthread_mutex_unlock(&mutex2);
return 0;
}
int main(int argc, char *argv[])
{
pthread_t th1, th2;
pthread_create(&th1, NULL, thread1, (void*)NULL );
pthread_mutex_lock(&mutex1);
things_done++;
pthread_mutex_unlock(&mutex1);
pthread_create(&th2, NULL, thread2, (void*)NULL );