Pelles C forum

Pelles C => Bug reports => Topic started by: whatsup on November 18, 2010, 08:48:21 PM

Title: this bug (with memmove) killed me :(
Post by: 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:


// *********************************************************************
// 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
Title: Re: this bug (with memmove) killed me :(
Post by: whatsup on November 20, 2010, 11:06:16 PM
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.
Title: Re: this bug (with memmove) killed me :(
Post by: AlexN on November 21, 2010, 05:18:59 PM
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).