Article: Q64791
Product(s): See article
Version(s): 6.00 | 6.00
Operating System(s): MS-DOS | OS/2
Keyword(s): ENDUSER | buglist6.00 | mspl13_c
Last Modified: 15-AUG-1990
In rare cases, the intrinsic form of memcpy may produce incorrect code
in the large memory model.
The code below, if compiled with the large memory model (/AL) and any
optimization that includes intrinsic functions (/Oi, /Ox, /Oz), will
cause the machine to hang under DOS and cause a protection violation
under OS/2.
To work around this problem, either compile without the /Oi option or
use #pragma "function(memcpy)" to specify the use of the function form
of memcpy(). The pragma may be turned off for functions following it
by using #pragma intrinsic(memcpy) to go back to the intrinsic form of
memcpy.
Sample Code
-----------
#include <stdio.h>
#include <string.h>
#include <malloc.h>
typedef struct
{
int dummy;
char *f_char[8];
char *f_attr[8];
} t_field;
void copy_fieldtxt(t_field *, t_field *, int, int);
void main(void)
{
t_field *src, *dst;
void *calloc();
src=(t_field *)calloc(1,sizeof(t_field));
dst=(t_field *)calloc(1,sizeof(t_field));
src->f_char[0]= strdup("Text string");
src->f_attr[0]= strdup("attribute string");
dst->f_char[1]=strdup("Text string");
dst->f_attr[1]=strdup("attribute string");
copy_fieldtxt(src,dst,0,1);
printf("dst->attr[1]==>%s\n",dst->f_attr[1]);
}
/* Copies src->f_char[srcndx] to dst->f_char[dstndx]
and src->f_attr[srcndx] to dst->f_attr[dstndx] */
void copy_fieldtxt(t_field *src, t_field *dst, int srcndx, int dstndx)
{
int maxlen=strlen(dst->f_attr[dstndx]);
memcpy(dst->f_char[dstndx], src->f_char[srcndx], maxlen);
memcpy(dst->f_attr[dstndx], src->f_attr[srcndx],maxlen);
}
Microsoft has confirmed this to be a problem in C version 6.00. We are
researching this problem and will post new information here as it
becomes available.