------------------------------------------------------------
[BUG/PRB.] VFP 9.0 FIX - RATC() FUNCTION
January 2025
------------------------------------------------------------
CCB
1. BUG:
In vfp9 (and vfp6, vfp7, vfp8), sometimes vfp will crash when calling the RATC() function.
The bug only occurs in DBCS (Double-Byte Character Sets) environments.
In non-DBCS (Double-Byte Character Sets) environments, the RATC() function is the same as the RAT() function, so there is no the bug.
There is a test program:
*PROC testratcfunction
?RAT(CHR(0),"12345678") && Displays 0
?RATC(CHR(0),"12345678") && Displays 2
WAIT
RETURN
* END OF PROC TESTRATCFUNCTION.
We think they will display 0, but:
?RATC(CHR(0),"12345678") && Displays 2
2. CAUSE:
When VFP 9.0 and earlier versions calculate RATC(CHR(0),"12345678"),
please refer to the memory dump data:
011887C0 ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
011887D0 05 00 09 00 B5 07 18 01 08 00 00 00 10 00 00 00
011887E0 31 32 33 34 35 36 37 38 AB AB AB AB AB AB AB AB
011887F0 ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
It will search the string CHR(0) from right to left:
011887E7: 38 ;; it is not equal to CHR(0), search continue...
011887E6: 37 ;; it is not equal to CHR(0), search continue...
011887E5: 36 ;; it is not equal to CHR(0), search continue...
011887E4: 35 ;; it is not equal to CHR(0), search continue...
011887E3: 34 ;; it is not equal to CHR(0), search continue...
011887E2: 33 ;; it is not equal to CHR(0), search continue...
011887E1: 32 ;; it is not equal to CHR(0), search continue...
011887E0: 31 ;; it is not equal to CHR(0), search continue...
011887DF: 00 ;; it is equal to CHR(0), search end, but it's wrong!
In this case, RATC(CHR(0),"12345678") returns a wrong value.
In some cases, for example, to calculate RATC(CHR(255),"12345678"),
011887E7: 38 ;; it is not equal to CHR(255), search continue...
011887E6: 37 ;; it is not equal to CHR(255), search continue...
011887E5: 36 ;; it is not equal to CHR(255), search continue...
011887E4: 35 ;; it is not equal to CHR(255), search continue...
011887E3: 34 ;; it is not equal to CHR(255), search continue...
011887E2: 33 ;; it is not equal to CHR(255), search continue...
011887E1: 32 ;; it is not equal to CHR(255), search continue...
011887E0: 31 ;; it is not equal to CHR(255), search continue...
011887DF: 00 ;; it is not equal to CHR(255), search continue, but it's wrong!
011887DE: 00 ;; it is not equal to CHR(255), search continue, but it's wrong!
011887DD: 00 ;; it is not equal to CHR(255), search continue, but it's wrong!
011887DC: 10 ;; it is not equal to CHR(255), search continue, but it's wrong!
011887DB: 00 ;; it is not equal to CHR(255), search continue, but it's wrong!
011887DA: 00 ;; it is not equal to CHR(255), search continue, but it's wrong!
011887D9: 00 ;; it is not equal to CHR(255), search continue, but it's wrong!
011887D8: 08 ;; it is not equal to CHR(255), search continue, but it's wrong!
011887D7: 01 ;; it is not equal to CHR(255), search continue, but it's wrong!
011887D6: 18 ;; it is not equal to CHR(255), search continue, but it's wrong!
011887D5: 07 ;; it is not equal to CHR(255), search continue, but it's wrong!
011887D4: B5 ;; it is not equal to CHR(255), search continue, but it's wrong!
011887D3: 00 ;; it is not equal to CHR(255), search continue, but it's wrong!
011887D2: 09 ;; it is not equal to CHR(255), search continue, but it's wrong!
011887D1: 00 ;; it is not equal to CHR(255), search continue, but it's wrong!
011887D0: 05 ;; it is not equal to CHR(255), search continue, but it's wrong!
011887CF: ?? ;; search in inaccessible memory, the memory access violation exception (exception code 0xC0000005)!
and then vfp will crash.
3. RESOLUTION:
We can write some code to fix the BUG.
Label590b51 ::
push ebp ;0x00590b51 : 55
push edi ;0x00590b52 : 57
call CharPrevA ;0x00590b53 : ff15f8729100
movzx edx ,byte ptr [eax] ;0x00590b59 : 0fb610
test byte ptr [ edx + offset Data937120 ] , 01h ;0x00590b5c : f6822071930001
je Label590b71 ;0x00590b63 : 740c
mov ecx , ebp ;0x00590b65 : 8bcd
sub ecx , eax ;0x00590b67 : 2bc8
cmp ecx , 01h ;0x00590b69 : 83f901
jne Label590b71 ;0x00590b6c : 7503
dec esi ;0x00590b6e : 4e
mov ebp , eax ;0x00590b6f : 8be8
Label590b71 ::
cmp esi , dword ptr [ esp + 20 ] ;0x00590b71 : 3b742414
mov dword ptr [ esp + 52 ] , esi ;0x00590b75 : 89742434
mov ebx , esi ;0x00590b79 : 8bde
ja Label5435d1 ;0x00590b7b : 0f87502afbff
Label590b81 ::
mov dl , byte ptr [ esp + 19 ] ;0x00590b81 : 8a542413
cmp byte ptr [ ebp + 0 ] , dl ;0x00590b85 : 385500
jne Label590ba4 ;0x00590b88 : 751a
mov ecx , dword ptr [ esp + 24 ] ;0x00590b8a : 8b4c2418
mov esi , dword ptr [ esp + 28 ] ;0x00590b8e : 8b74241c
mov edi , ebp ;0x00590b92 : 8bfd
xor eax , eax ;0x00590b94 : 33c0
repz cmpsb ;0x00590b96 : f3a6
jne Label590ba0 ;0x00590b98 : 7506
dec dword ptr [ esp + 48 ] ;0x00590b9a : ff4c2430
je Label590b25 ;0x00590b9e : 7485
Label590ba0 ::
mov edi , dword ptr [ esp + 36 ] ;0x00590ba0 : 8b7c2424
Label590ba4 ::
push ebp ;0x00590ba4 : 55
push edi ;0x00590ba5 : 57
call CharPrevA ;0x00590ba6 : ff15f8729100
cmp eax , ebp ;0x00590bac : 3bc5
jne Label590bb4 ;0x00590bae : 7504
inc ebx ;0x00590bb0 : 43
dec ebp ;0x00590bb1 : 4d
jmp Label590bbc ;0x00590bb2 : eb08
Label590bb4 ::
mov ecx , eax ;0x00590bb4 : 8bc8
sub ecx , ebp ;0x00590bb6 : 2bcd
add ebx , ecx ;0x00590bb8 : 03d9
mov ebp , eax ;0x00590bba : 8be8
Label590bbc ::
;
; -------------------------------------------------
; VFP 9.0 FIX - RATC() FUNCTION
; March 2020
; -------------------------------------------------
; CCB
;
; Sometimes vfp will crash when calling the RATC() function.
;
; 2020/3/1, by ccb
;
cmp dword ptr [ esp + 28h ] , offset Label4dae9a ;; Fun4dae39 .. ; proc near
jne Label590bbd
cmp dword ptr [ esp + 28h + (4+14h+1Ch) ] , offset Label4a7469 ;; Label4a7459 ..
jne Label590bbd
cmp ebp , edi
jb Label590bcd
Label590bbd ::
mov ecx , dword ptr [ esp + 52 ] ;0x00590bbc : 8b4c2434
mov eax , dword ptr [ esp + 20 ] ;0x00590bc0 : 8b442414
dec ecx ;0x00590bc4 : 49
cmp ebx , eax ;0x00590bc5 : 3bd8
mov dword ptr [ esp + 52 ] , ecx ;0x00590bc7 : 894c2434
jbe Label590b81 ;0x00590bcb : 76b4
Label590bcd ::
pop ebp ;0x00590bcd : 5d
pop esi ;0x00590bce : 5e
pop edi ;0x00590bcf : 5f
xor eax , eax ;0x00590bd0 : 33c0
pop ebx ;0x00590bd2 : 5b
add esp , 018h ;0x00590bd3 : 83c418
ret 014h ;0x00590bd6 : c21400
4. APPLIES TO:
VFP 6.0.8167.0
VFP 6.0.8961.0 (SP5)
VFP 7.0.0.9262
VFP 7.0.0.9465 (SP1)
VFP 8.0.0.2521
VFP 8.0.0.3117 (SP1)
VFP 9.0.0.2412
VFP 9.0.0.3504 (SP1)
VFP 9.0.0.4611 (SP2)
VFP 9.0.0.5015 (SP2)
VFP 9.0.0.5411 (SP2)
VFP 9.0.0.5721 (SP2)
VFP 9.0.0.5815 (SP2)
VFP 9.0.0.6303 (SP2)
VFP 9.0.0.6602 (SP2)
VFP 9.0.0.7423 (SP2)
The bug has been fixed in VFP Advanced.
IMPORTANT NOTE:
Some vfp tools (for example, the "Code References" tool) use the RATC() function, sometimes vfp will crash when using these vfp tools.
Please refer the following files:
C:\Program Files (x86)\Microsoft Visual FoxPro 9\Ffc\_controls.vcx
C:\Program Files (x86)\Microsoft Visual FoxPro 9\Ffc\_dataquery.vcx
C:\Program Files (x86)\Microsoft Visual FoxPro 9\Ffc\_movers.vcx
C:\Program Files (x86)\Microsoft Visual FoxPro 9\Gallery\vfpglry.vcx
C:\Program Files (x86)\Microsoft Visual FoxPro 9\Toolbox\_toolbox.vcx
C:\Program Files (x86)\Microsoft Visual FoxPro 9\Wizards\apphook.vcx
C:\Program Files (x86)\Microsoft Visual FoxPro 9\Samples\Classes\samples.vcx
C:\Program Files (x86)\Microsoft Visual FoxPro 9\Samples\Solution\Forms\qbe.vcx
C:\Program Files (x86)\Microsoft Visual FoxPro 9\Samples\Solution\Forms\qbf.vcx
C:\Program Files (x86)\Microsoft Visual FoxPro 9\Samples\Servers\Foxisapi\Foxis\isapi.vcx
C:\Program Files (x86)\Microsoft Visual FoxPro 9\Tools\xsource\VFPSource\beautify\beautify.prg
C:\Program Files (x86)\Microsoft Visual FoxPro 9\tools\xsource\vfpsource\foxref\foxmatch.prg
C:\Program Files (x86)\Microsoft Visual FoxPro 9\tools\xsource\vfpsource\foxref\foxrefengine.prg
C:\Program Files (x86)\Microsoft Visual FoxPro 9\tools\xsource\vfpsource\toolbox\_toolbox.vcx
C:\Program Files (x86)\Microsoft Visual FoxPro 9\tools\xsource\vfpsource\toolbox\_toolboxdefault.vcx
C:\Program Files (x86)\Microsoft Visual FoxPro 9\tools\xsource\vfpsource\builders\builders\builder.vcx
C:\Program Files (x86)\Microsoft Visual FoxPro 9\tools\xsource\vfpsource\wizards\wzapp\wzapp.prg
C:\Program Files (x86)\Microsoft Visual FoxPro 9\tools\xsource\vfpsource\wizards\wzapp\wzapp.vcx
C:\Program Files (x86)\Microsoft Visual FoxPro 9\tools\xsource\vfpsource\wizards\wzcommon\wzengine.prg
C:\Program Files (x86)\Microsoft Visual FoxPro 9\tools\xsource\vfpsource\wizards\wzcommon\wizmover.vcx
C:\Program Files (x86)\Microsoft Visual FoxPro 9\tools\xsource\vfpsource\wizards\wzquery\emit.prg
C:\Program Files (x86)\Microsoft Visual FoxPro 9\tools\xsource\vfpsource\wizards\wzquery\wzquery.vcx
C:\Program Files (x86)\Microsoft Visual FoxPro 9\tools\xsource\vfpsource\wizards\wztable\wztbleng.prg
C:\Program Files (x86)\Microsoft Visual FoxPro 9\tools\xsource\vfpsource\wizards\wztable\wzdbc.vcx
C:\Program Files (x86)\Microsoft Visual FoxPro 9\tools\xsource\vfpsource\wizards\wztable\wztable.vcx
5. REFERENCE WEBSITES:
1, baiyujia.com:
http://www.baiyujia.com
2, microsoft.com:
https://social.msdn.microsoft.com/forums/en-US/219a9eb1-f8e5-4c1e-b979-cd127d1a9819/vfp-9-tool-core-references-problem
3, mzvfp.com:
http://www.mzvfp.com/read.php?tid=104658
http://www.mzvfp.com/read.php?tid=104863
4, csdn.net:
https://bbs.csdn.net/topics/250084102
6. OTHER:
For reference only, there is no guarantees.
Any questions or suggestions, please send me an email at ccb2000@163.com.
|