VirtualBox

Ignore:
Timestamp:
Apr 21, 2020 11:14:20 AM (5 years ago)
Author:
vboxsync
Message:

IPRT: Implement RTStrEnd in assembly & C++, drop the inlining. memchr from VC++ 14.1 cannot deal wtih RTSTR_MAX on unaligned string, it may step into an electric fence page after the end of the string. bugref:8489

Location:
trunk/src/VBox/Runtime/common/string
Files:
2 copied

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Runtime/common/string/RTStrEnd.asm

    r83872 r83886  
    11; $Id$
    22;; @file
    3 ; IPRT - No-CRT memchr - AMD64 & X86.
     3; IPRT - RTStrEnd - AMD64 & X86.
    44;
    55
     
    3030
    3131;;
    32 ; @param    pv      gcc: rdi  msc: ecx  x86:[esp+4]   wcall: eax
    33 ; @param    ch      gcc: esi  msc: edx  x86:[esp+8]   wcall: edx
    34 ; @param    cb      gcc: rdx  msc: r8   x86:[esp+0ch] wcall: ebx
    35 RT_NOCRT_BEGINPROC memchr
     32; @param    pszString   gcc: rdi  msc: rcx  x86:[esp+4]   wcall: eax
     33; @param    cchMax      gcc: rsi  msc: rdx  x86:[esp+8]   wcall: edx
     34;
     35BEGINPROC_EXPORTED RTStrEnd
    3636        cld
    3737%ifdef RT_ARCH_AMD64
    3838 %ifdef ASM_CALL64_MSC
    39         or      r8, r8
     39        or      rdx, rdx
    4040        jz      .not_found_early
    4141
    4242        mov     r9, rdi                 ; save rdi
    43         mov     eax, edx
    4443        mov     rdi, rcx
    45         mov     rcx, r8
     44        mov     rcx, rdx
    4645 %else
    47         mov     rcx, rdx
     46        mov     rcx, rsi
    4847        jrcxz   .not_found_early
    49 
    50         mov     eax, esi
    5148 %endif
    5249
    5350%else
    5451 %ifdef ASM_CALL32_WATCOM
    55         mov     ecx, ebx
     52        mov     ecx, edx
    5653        jecxz   .not_found_early
    57         xchg    eax, edx
    58         xchg    edi, edx                ; load and save edi.
     54        mov     edx, edi                ; save rdi
     55        mov     edi, eax
    5956 %else
    60         mov     ecx, [esp + 0ch]
     57        mov     ecx, [esp + 8]
    6158        jecxz   .not_found_early
    6259        mov     edx, edi                ; save edi
    63         mov     eax, [esp + 8]
    6460        mov     edi, [esp + 4]
    6561 %endif
    6662%endif
     63        xor     eax, eax                ; we're searching for zero
    6764
    6865        ; do the search
     
    9087        xor     eax, eax
    9188        ret
    92 ENDPROC RT_NOCRT(memchr)
     89ENDPROC RTStrEnd
    9390
  • trunk/src/VBox/Runtime/common/string/RTStrEnd.cpp

    r83872 r83886  
    11/* $Id$ */
    22/** @file
    3  * IPRT - CRT Strings, memcpy().
     3 * IPRT - RTStrEnd, C++ version.
    44 */
    55
     
    3232
    3333
    34 /**
    35  * Search a memory block for a character.
    36  *
    37  * @returns Pointer to the first instance of ch in pv.
    38  * @returns NULL if ch wasn't found.
    39  * @param   pv          Pointer to the block to search.
    40  * @param   ch          The character to search for.
    41  * @param   cb          The size of the block.
    42  */
    43 #ifdef _MSC_VER /* Silly 'safeness' from MS. */
    44 # if _MSC_VER >= 1400
    45 _CRTIMP __checkReturn _CONST_RETURN void *  __cdecl memchr( __in_bcount_opt(_MaxCount) const void * pv, __in int ch, __in size_t cb)
    46 # else
    47 void *memchr(const void *pv, int ch, size_t cb)
    48 # endif
    49 #else
    50 void *memchr(const void *pv, int ch, size_t cb)
    51 #endif
     34RTDECL(char *) RTStrEnd(const char *pszString, size_t cchMax)
    5235{
    53     register uint8_t const *pu8 = (uint8_t const *)pv;
    54     register size_t cb2 = cb;
    55     while (cb2-- > 0)
     36    while (cchMax-- > 0)
    5637    {
    57         if (*pu8 == ch)
    58             return (void *)pu8;
    59         pu8++;
     38        if (*pszString)
     39        { }
     40        else
     41            return pszString;
     42        pszString++;
    6043    }
    6144    return NULL;
    6245}
    63 
     46RT_EXPORT_SYMBOL(RTStrEnd);
Note: See TracChangeset for help on using the changeset viewer.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette