Подстрока возвращает мусор при использовании на путях - PullRequest
0 голосов
/ 18 апреля 2020

У меня есть следующий фрагмент кода, чтобы прочитать набор путей из другого процесса ..

//Allocate a large enough string to hold the paths..
std::string path(1024, '\0'); //there will never be a path > 1024 in length..
mach_vm_size_t size = path.size();

//Read them from the process..
int err = mach_vm_read_overwrite(task, reinterpret_cast<mach_vm_address_t>(image_infos[i].imageFilePath), size, reinterpret_cast<mach_vm_address_t>(&path[0]), &size);
if (err == KERN_SUCCESS)
{
    //Strip the path down to just the file name.
    std::string::size_type pos = path.find_last_of("\\/");
    if (pos != std::string::npos)
    {
        //Strip path components (prints just fine)
        printf("PATH: %s\n", path.c_str());

        path = path.substr(pos + 1);

        //After stripping the path (prints absolute trash)
        printf("PATH AFTER: %s\n", path.c_str());
    }
}

Перед удалением он возвращает меня:

PATH: /Applications/Xcode.app/Contents/Developer/usr/lib/libBacktraceRecording.dylib
PATH: /Applications/Xcode.app/Contents/Developer/usr/lib/libMainThreadChecker.dylib
PATH: /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/Library/Debugger/libViewDebuggerSupport.dylib
PATH: /usr/lib/libc++.1.dylib
PATH: /usr/lib/libSystem.B.dylib
PATH: /usr/lib/libc++abi.dylib
PATH: /usr/lib/system/libcache.dylib
PATH: /usr/lib/system/libcommonCrypto.dylib
PATH: /usr/lib/system/libcompiler_rt.dylib
PATH: /usr/lib/system/libcopyfile.dylib
PATH: /usr/lib/system/libcorecrypto.dylib
PATH: /usr/lib/system/introspection/libdispatch.dylib
PATH: /usr/lib/system/libdyld.dylib
PATH: /usr/lib/system/libkeymgr.dylib
PATH: /usr/lib/system/liblaunch.dylib
PATH: /usr/lib/system/libmacho.dylib
PATH: /usr/lib/system/libquarantine.dylib
PATH: /usr/lib/system/libremovefile.dylib
PATH: /usr/lib/system/libsystem_asl.dylib
PATH: /usr/lib/system/libsystem_blocks.dylib
PATH: /usr/lib/system/libsystem_c.dylib
PATH: /usr/lib/system/libsystem_configuration.dylib
PATH: /usr/lib/system/libsystem_coreservices.dylib
PATH: /usr/lib/system/libsystem_darwin.dylib
PATH: /usr/lib/system/libsystem_dnssd.dylib
PATH: /usr/lib/system/libsystem_featureflags.dylib
PATH: /usr/lib/system/libsystem_info.dylib
PATH: /usr/lib/system/libsystem_m.dylib
PATH: /usr/lib/system/libsystem_malloc.dylib
PATH: /usr/lib/system/libsystem_networkextension.dylib
PATH: /usr/lib/system/libsystem_notify.dylib
PATH: /usr/lib/system/libsystem_sandbox.dylib
PATH: /usr/lib/system/libsystem_secinit.dylib
PATH: /usr/lib/system/libsystem_kernel.dylib
PATH: /usr/lib/system/libsystem_platform.dylib
PATH: /usr/lib/system/introspection/libsystem_pthread.dylib
PATH: /usr/lib/system/libsystem_symptoms.dylib
PATH: /usr/lib/system/libsystem_trace.dylib
PATH: /usr/lib/system/libunwind.dylib
PATH: /usr/lib/system/libxpc.dylib
PATH: /usr/lib/libobjc.A.dylib
PATH: /System/Library/Frameworks/Foundation.framework/Versions/C/Foundation
PATH: /System/Library/Frameworks/CoreFoundation.framework/Versions/A/CoreFoundation
PATH: /usr/lib/libauto.dylib
PATH: /usr/lib/libfakelink.dylib
PATH: /usr/lib/libcompression.dylib
PATH: /System/Library/Frameworks/DiskArbitration.framework/Versions/A/DiskArbitration
PATH: /usr/lib/libarchive.2.dylib
PATH: /System/Library/PrivateFrameworks/MediaServices.framework/Versions/A/MediaServices

После удаления ЛЮБОГО из пути, я получаю получитаемый мусор (printf("%s\n"))

libMainThreadChecker.dylib
SceneKi
libcmph.dylib
libTelephonyUtilDynamic.dylib
libcompression.dylib



libsystem_kernel.dylib
libkxld.dylib
libmacho


libsystem_c.dylib

После удаления ЛЮБОГО из путей, я получаю странный мусор (std::cout):

    \214\2512\325\377\377\377\377\377\377\377\377[e\377Ь_\377\340\230H\370([e\377 \350\260\230\355
P\357
X
HƼ\331\377\2256\377\377\377\371\357p^02ǭ\2422"U\377\377\377\377\377\377\377\377\260,e\377Ь_\377\340\370@\265,e\377 H\300\360
\361\360
\371\361
\331\362
\341\363
\321\364
\321\365
\321\366
\251\367
Y\370
1\371
9\372
\373
1\374
\375
)\376
9\377
AIA9Q\351       \371
\271
yAI
\211aX
PӼ\331\377h8\377\377\377\371\357p^$\3641Q2\325\377\377\377\377\377\377\377\377@`e\377Ь_\377\340H\250\340E`e\377 \230`\230\355
X
8g\275\331\377n7\377\377\377\354\357p^\266\327\375\2532 U\377\377\377\377\377\377\377\377ph\377Ь_\377\340Hhb\240th\377 \230 x

I попробовал это также:

if (err == KERN_SUCCESS && size > 0 && size < 1024)
{
    path = path.substr(0, size);
}

Если я использую std::cout, вывод будет еще хуже, чем printf("%s\n"). Все это происходит, как только я делаю substr, и я понятия не имею, почему .. без него все работает просто отлично: S

Я использую Xcode Version 11.4.1 (11E503a) ..

MacBook-Pro ~ % clang --version
Apple clang version 11.0.3 (clang-1103.0.32.59)
Target: x86_64-apple-darwin19.4.0
Thread model: posix
InstalledDir: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin

Есть идеи, что происходит? Я сделал что-то не так с std::string::substr?

РЕДАКТИРОВАТЬ: Если я сделаю:

char buffer[512] = {0};
mach_vm_size_t size = sizeof(buffer);

int err = mach_vm_read_overwrite(task, reinterpret_cast<mach_vm_address_t>(image_infos[i].imageFilePath), size, reinterpret_cast<mach_vm_address_t>(&buffer[0]), &size);
if (err == KERN_SUCCESS)
{
    std::string path = buffer; //lol

    std::string::size_type pos = path.find_last_of("\\/");
    if (pos != std::string::npos)
    {
        //Strip path components
        path = path.substr(pos + 1);

        printf("PATH: %s\n", path.c_str()); //PRINTS PERFECTLY!
    }
}

1 Ответ

0 голосов
/ 18 апреля 2020

Проблема в том, что C строки заканчиваются NUL, тогда как в C ++ std :: string могут содержаться встроенные NUL. Поэтому после прочтения пути вам нужно сжать строку до ее фактической длины, которая равна strlen(path.data()) (а не path.size(), что является размером буфера только в этой точке), прежде чем делать что-либо еще.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...