In this section:

Overview

This problem occurs when an attempt is made to dereference a pointer whose value is invalid or that Insure++ did not see allocated.

There are several causes for this error:

  • Errors in user code that result in pointers that don’t point at any known memory block.
  • Compiling only some of the files that make up an application. This can result in Insure++ not knowing enough about memory usage to distinguish correct and erroneous behavior.

This section focuses on the first type of problem described in this section. For information on the second type of problem, contact Parasoft’s Quality Consultants.

CodeDescriptionEnabledReportedPlatform
READ_WILDReading wild pointer(tick)RuntimeWindows/Unix


Problem 1

The following code attempts to use the address of a variable but contains an error at line 8 - the address operator (&) has been omitted.

/*
 * File: readwld1.c
 */
main()
{
	int *a, i = 123, b;

	a = i;
	b = *a;
	return (0);
}

Diagnosis at Runtime

[readwld1.c:9] **READ_WILD**
>>		 b = *a;
Reading wild pointer: a
Pointer : 0x0000007b
Stack trace where the error occurred:
		main() readwld1.c, 9
  • Line 2: Source line at which the problem was detected.
  • Line 3: Description of the problem and the name of the parameter that is in error.
  • Line 4: Value of the bad pointer.
  • Line 6: Stack trace showing the function call sequence leading to the error. 

Most compilers will generate warning messages for this error because the assignment uses incompatible types.

Problem 2

Another version of the same problem can occur when using union types. The following code first assigns the pointer element of a union but then overwrites it with another element before using it.

/*
 * File: readwld2.c
 */
union {
	int *ptr;
	int ival;
} u;

main()
{
	int b, i = 123;

	u.ptr = &i;
	u.ival = i;
	b = *u.ptr;
	return (0);
}

This code will not generate compile time errors

Diagnosis at Runtime

[readwld2.c:15] **READ_WILD**
>>		 b = *u.ptr;
Reading wild pointer: u.ptr
Pointer : 0x0000007b
Stack trace where error occurred:
	main() readwld2.c, 15
  • Line 2: Source line at which the problem was detected.
  • Line 3: Description of the problem and the expression that is in error.
  • Line 4: Value of the bad pointer.
  • Line 6: Stack trace showing the function call sequence leading to the error.

Repair

The simpler types of problem are most conveniently tracked in a debugger by stopping the program at the indicated source line. You should then examine the illegal value and attempt to see where it was generated. Alternatively you can stop the program at some point shortly before the error and singlestep through the code leading up to the problem.

Wild pointers can also be generated when Insure++ has only partial information about your program’s structure. For more information on this topic, contact Parasoft’s Quality Consultants.

  • No labels