this bug (with memmove) killed me :(

Started by whatsup, November 18, 2010, 08:48:21 PM

Previous topic - Next topic

whatsup

i post here an example code
two functions use the same code
except one thing
one function uses PellesC memmove
the other uses Mymemmove
watch the results:


// *********************************************************************
// Created with BCX - BASIC To C/C++ Translator (V) 7.00 (10.11.15)
//                 BCX (c) 1999 - 2009 by Kevin Diggins
// *********************************************************************
//              Translated for compiling with a C Compiler
// *********************************************************************
#include <windows.h>    // Win32 Header File
#include <windowsx.h>   // Win32 Header File
#include <commctrl.h>   // Win32 Header File
#include <commdlg.h>    // Win32 Header File
#include <mmsystem.h>   // Win32 Header File
#include <shellapi.h>   // Win32 Header File
#include <shlobj.h>     // Win32 Header File
#include <richedit.h>   // Win32 Header File
#include <wchar.h>      // Win32 Header File
#include <objbase.h>    // Win32 Header File
#include <ocidl.h>      // Win32 Header File
#include <winuser.h>    // Win32 Header File
#include <olectl.h>     // Win32 Header File
#include <oaidl.h>      // Win32 Header File
#include <ole2.h>       // Win32 Header File
#include <oleauto.h>    // Win32 Header File
#include <winsock.h>    // Win32 Header File
#include <conio.h>
#include <direct.h>
#include <ctype.h>
#include <io.h>
#include <fcntl.h>
#include <math.h>
#include <stdio.h>
#include <string.h>
#include <stddef.h>
#include <stdlib.h>
#include <setjmp.h>
#include <time.h>
#include <stdarg.h>
#include <process.h>

// ***************************************************
// Compiler Defines
// ***************************************************

// C++
#if defined( __cplusplus )
 #define overloaded
 #define C_EXPORT EXTERN_C __declspec(dllexport)
 #define C_IMPORT EXTERN_C __declspec(dllimport)
#else
 #define C_EXPORT __declspec(dllexport)
 #define C_IMPORT __declspec(dllimport)
#endif

// Open Watcom defs
#if defined( __WATCOM_CPLUSPLUS__ ) || defined( __TINYC__ )
 #define atanl atan
 #define sinl  sin
 #define cosl  cos
 #define tanl  tan
 #define asinl asin
 #define acosl acos
 #define log10l log10
 #define logl   log
 #define _fcloseall fcloseall
#endif

// Borland C++ 5.5.1 defs - bcc32.exe
#if defined( __BCPLUSPLUS__ )
 // ===== Borland Libraries ==========
 #include <dos.h>
 #pragma comment(lib,"import32.lib")
 #pragma comment(lib,"cw32.lib")
 // ==================================
#endif

// Microsoft VC++
#ifndef DECLSPEC_UUID
 #if (_MSC_VER >= 1100) && defined ( __cplusplus )
   #define DECLSPEC_UUID(x)    __declspec(uuid(x))
 #else
   #define DECLSPEC_UUID(x)
 #endif
#endif

#define BCX_STRING_SIZE  2048
// *************************************************


#if !defined( __LCC__ )
// *************************************************
// Instruct Linker to Search Object/Import Libraries
// *************************************************
#pragma comment(lib,"kernel32.lib")
#pragma comment(lib,"user32.lib")
#pragma comment(lib,"gdi32.lib")
#pragma comment(lib,"comctl32.lib")
#pragma comment(lib,"advapi32.lib")
#pragma comment(lib,"winspool.lib")
#pragma comment(lib,"shell32.lib")
#pragma comment(lib,"ole32.lib")
#pragma comment(lib,"oleaut32.lib")
#pragma comment(lib,"uuid.lib")
#pragma comment(lib,"odbc32.lib")
#pragma comment(lib,"odbccp32.lib")
#pragma comment(lib,"winmm.lib")
#pragma comment(lib,"comdlg32.lib")
#pragma comment(lib,"imagehlp.lib")
#pragma comment(lib,"version.lib")
#else
#pragma lib <winspool.lib>
#pragma lib <shell32.lib>
#pragma lib <ole32.lib>
#pragma lib <oleaut32.lib>
#pragma lib <uuid.lib>
#pragma lib <odbc32.lib>
#pragma lib <odbccp32.lib>
#pragma lib <winmm.lib>
#pragma lib <imagehlp.lib>
#pragma lib <version.lib>
// *************************************************
// End of Object/Import Libraries To Search
// *************************************************
#endif




// *************************************************
//            User Global Initialized Arrays
// *************************************************



// *************************************************
//                 Runtime Functions
// *************************************************

// *************************************************
//                  Main Program
// *************************************************

char myBuf[100];
char *MyPtr1;
#define TranslateSlash 1


void Mymemmove(char *dest,char *src,int sze) {
 register int i = sze;
 dest+=i;
 src+=i;
 while(i) {
   src--;
   dest--;
   dest[0]=src[0];
   i--;
 }
}


void Test1(void)
{
int j,eStr = 1;
 MyPtr1 = myBuf;
strcpy(MyPtr1,"\"0rntx\\\"");

         printf("the token is =%s=\n",MyPtr1);

REPEAT0000:;
         do {
           ++MyPtr1;
           if(MyPtr1[0]==92)
           {
             ++MyPtr1;
             if(TranslateSlash)
             {
               if(eStr)
               {
                 j=strlen(MyPtr1);
                 printf("MyPtr =%s=  Len=%d\n",MyPtr1,(int)j);
                 memmove(MyPtr1+1,MyPtr1,j+1);
                 printf("the token after poke is =%s=\n    ptr after poke is=%s=\n",myBuf,MyPtr1);
                 MyPtr1[0] = 92;
               }
               goto REPEAT0000;
             }
             goto EndSelect_3;
           }
           if(MyPtr1[0]==2)
           {
             MyPtr1[0] = 92;
             goto REPEAT0000;
           }
           EndSelect_3:;
         }while(!(MyPtr1[0]==0));
         printf("the token after slash =%s=\n",myBuf);
}


void Test2(void)
{
int j,eStr = 1;
 MyPtr1 = myBuf;
strcpy(MyPtr1,"\"0rntx\\\"");

         printf("the token is =%s=\n",MyPtr1);

REPEAT0000:;
         do {
           ++MyPtr1;
           if(MyPtr1[0]==92)
           {
             ++MyPtr1;
             if(TranslateSlash)
             {
               if(eStr)
               {
                 j=strlen(MyPtr1);
                 printf("MyPtr =%s=  Len=%d\n",MyPtr1,(int)j);
                 Mymemmove(MyPtr1+1,MyPtr1,j+1);
                 printf("the token after poke is =%s=\n    ptr after poke is=%s=\n",myBuf,MyPtr1);
                 MyPtr1[0] = 92;
               }
               goto REPEAT0000;
             }
             goto EndSelect_3;
           }
           if(MyPtr1[0]==2)
           {
             MyPtr1[0] = 92;
             goto REPEAT0000;
           }
           EndSelect_3:;
         }while(!(MyPtr1[0]==0));
         printf("the token after slash =%s=\n",myBuf);
}

int __cdecl main(int argc, char** argv)
{
printf("using PellesC memmove\n");
Test1();
printf("\n\nnow using my memmove\n");
Test2();
}  // End of main program




the output of this is:
Quote
using PellesC memmove
the token is ="0rntx\"=
MyPtr ="=  Len=1
the token after poke is ="0rntx\"=
   ptr after poke is="=
the token after slash ="0rntx\\=


now using my memmove
the token is ="0rntx\"=
MyPtr ="=  Len=1
the token after poke is ="0rntx\""=
   ptr after poke is=""=
the token after slash ="0rntx\\"=
the second output (mymemmove) is the correct one


the output of this when using other compiler is:
Quote
using PellesC memmove
the token is ="0rntx\"=
MyPtr ="=  Len=1
the token after poke is ="0rntx\""=
    ptr after poke is=""=
the token after slash ="0rntx\\"=


now using my memmove
the token is ="0rntx\"=
MyPtr ="=  Len=1
the token after poke is ="0rntx\""=
    ptr after poke is=""=
the token after slash ="0rntx\\"=
both outputs identical as expected

this is a bigggggg bug for me, since pellesC is my main compiler,
please fix this as soon as possible, and let me know

whatsup

thanks for the fix in the new release, it works.

what i didn't mention last time is that before memmove, i used:

strcpy(MyPtr+1,MyPtr)

and had a crash.

i thought that this because strcpy don't support overlapped buffers.

i also checked strcpy with the last release, and there is still a crash.

so if i'm wrong and strcpy should support overlapped, there is a bug with it.

with other compiler, there is no crash.

AlexN

Quote from: whatsup on November 18, 2010, 08:48:21 PM
i post here an example code
two functions use the same code
except one thing
one function uses PellesC memmove
the other uses Mymemmove
watch the results:

In such a case, when a function of the library of Pelles C does not work correct you can try to link the Microsoft runtime DLL msvcrt.dll, which is a part of Windows (this lib was part of the older versions of Pelles C, now you must create it from msvcrt.dll - look into forum how to create a lib from a dll).
best regards
Alex ;)