The Question is:
I'm trying to correct a bug in a c program using
DEC C V5.7-004 on OpenVMS Alpha V7.1 involving the use of the realloc function.
In short, the program builds a string by appending substrings. The following
sample, "aaabbbcccdddeeefff", might show appending 5 segments to the initial
string, "aaa" with 5 successive calls to realloc in a loop.
My symptom is that my string looses middle
segments and might appear as "aaaeeefff".
I can see the accumulator string build up with segments, like "aaabbbcccddd",
then, after a call which relocates the object to a new address of new block,
it looses content in its middle to become "aaaeeefff".
The function may be invoked as follows:
char *block_of_new_size ;
char *old_block ;
<initial heap block loaded with "aaa">
block_of_new_size = (char *)realloc((void *)old_block, size_of_new_block);
strcat( block_of_new_size, next_segment ); /*new_segment contains "bbb" or
"ccc", etc. with successive passes of the loop */
I'm exploring whether I give a value of "size_of_new_block" which is too small
causes realloc to transfer too few characters from the old block to the new
one... This may explain the bug...
But I was also wondering how dec c keeps track of the sizes of the blocks of
heap memory issued by realloc? Is the size stored with the block so that I
might overwrite it accidentally and corrupt it in such a fashion to confuse
realloc about how large th
e old block is at a particular address might be?
Are there any known bugs or restrictions associated with realloc?
The Answer is :
The OpenVMS Wizard prefers to use the lib$vm services directly, as
these can be tailored to the particular needs of the application.
Please be aware that strcat will look for a null byte, and will
continue to traverse memory until one is located. The requested
string concantenation operation will then ensue. This null byte
must obviously be accounted for and be present within the storage
allocated for the structure, or various corruptions can arise.
When posting such questions, a complete reproducer is appreciated and
greatly simplifies providing an answer -- open-ended "are there any
bugs?" questions are exceedingly difficult for the OpenVMS Wizard to
answer (in any specific terms).
Does your loop update the variable "old block"? If not, then each
realloc may create a new block initialized with just the (current)
contents of the first block of memory passed in...