Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/126.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ valgrind可能已丢失,但仍可访问并被valgrind检测到_C++_C++11_Memory Leaks_Valgrind_Memory Leak Detector - Fatal编程技术网

C++ valgrind可能已丢失,但仍可访问并被valgrind检测到

C++ valgrind可能已丢失,但仍可访问并被valgrind检测到,c++,c++11,memory-leaks,valgrind,memory-leak-detector,C++,C++11,Memory Leaks,Valgrind,Memory Leak Detector,我的环境是MacOS,valgrind-3.13.0,g++Apple LLVM版本9.0.0(clang-900.0.38) 正如标题所述,代码如下: #include <iostream> #include <stdlib.h> #include <sys/types.h> #include <sys/stat.h> #include <unistd.h> #include <fcntl.h> #include <

我的环境是MacOS,valgrind-3.13.0,g++Apple LLVM版本9.0.0(clang-900.0.38)

正如标题所述,代码如下:

#include <iostream>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/mman.h>

#define MAP_SIZE 4096UL
#define MAP_MASK (MAP_SIZE - 1)

int main(int argc, char** argv) {
    int fd = open("a.txt", O_RDWR | O_SYNC);
    std::cout << "open return fd: " << fd << std::endl;
    unsigned long offset = 0ul;
    std::cout << "page_size is: " << getpagesize() << std::endl;
    void* map_base = mmap(NULL, getpagesize(), PROT_READ | PROT_WRITE, MAP_SHARED, fd, offset);

    if (map_base == (void*) -1) {
        close(fd);
        std::cout << "fatal" << std::endl;
        return -1;
    }
    void* virt_addr = static_cast<void*>(static_cast<char*>(map_base) + (offset & MAP_MASK));
    std::cout << "memory map at base address: " << map_base << std::endl;
    std::cout << "value at address: " << virt_addr << std::endl;
    std::cout << sizeof(virt_addr) << std::endl;
    memset(virt_addr, 0, sizeof(int) * 100);
    munmap(map_base, getpagesize());
    close(fd);
    map_base = nullptr;
    virt_addr = nullptr;
}
==1725== Syscall param msg->desc.port.name points to uninitialised byte(s)
==1725==    at 0x10049734A: mach_msg_trap (in /usr/lib/system/libsystem_kernel.dylib)
==1725==    by 0x100496796: mach_msg (in /usr/lib/system/libsystem_kernel.dylib)
==1725==    by 0x100490485: task_set_special_port (in /usr/lib/system/libsystem_kernel.dylib)
==1725==    by 0x10062C10E: _os_trace_create_debug_control_port (in /usr/lib/system/libsystem_trace.dylib)
==1725==    by 0x10062C458: _libtrace_init (in /usr/lib/system/libsystem_trace.dylib)
==1725==    by 0x10015C9DF: libSystem_initializer (in /usr/lib/libSystem.B.dylib)
==1725==    by 0x10001AA1A: ImageLoaderMachO::doModInitFunctions(ImageLoader::LinkContext const&) (in /usr/lib/dyld)
==1725==    by 0x10001AC1D: ImageLoaderMachO::doInitialization(ImageLoader::LinkContext const&) (in /usr/lib/dyld)
==1725==    by 0x1000164A9: ImageLoader::recursiveInitialization(ImageLoader::LinkContext const&, unsigned int, char const*, ImageLoader::InitializerTimingList&, ImageLoader::UninitedUpwards&) (in /usr/lib/dyld)
==1725==    by 0x100016440: ImageLoader::recursiveInitialization(ImageLoader::LinkContext const&, unsigned int, char const*, ImageLoader::InitializerTimingList&, ImageLoader::UninitedUpwards&) (in /usr/lib/dyld)
==1725==    by 0x100015523: ImageLoader::processInitializers(ImageLoader::LinkContext const&, unsigned int, ImageLoader::InitializerTimingList&, ImageLoader::UninitedUpwards&) (in /usr/lib/dyld)
==1725==    by 0x1000155B8: ImageLoader::runInitializers(ImageLoader::LinkContext const&, ImageLoader::InitializerTimingList&) (in /usr/lib/dyld)
==1725==  Address 0x10488dc8c is on thread 1's stack
==1725==  in frame #2, created by task_set_special_port (???:)
==1725==  Uninitialised value was created by a stack allocation
==1725==    at 0x10062C0A6: _os_trace_create_debug_control_port (in /usr/lib/system/libsystem_trace.dylib)

==1725== LEAK SUMMARY:
==1725==    definitely lost: 0 bytes in 0 blocks
==1725==    indirectly lost: 0 bytes in 0 blocks
==1725==      possibly lost: 72 bytes in 3 blocks
==1725==    still reachable: 4,296 bytes in 7 blocks
==1725==         suppressed: 17,928 bytes in 153 blocks
并使用valgrind命令:

valgrind --tool=memcheck --leak-check=full ./mmap_test
结果如下:

#include <iostream>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/mman.h>

#define MAP_SIZE 4096UL
#define MAP_MASK (MAP_SIZE - 1)

int main(int argc, char** argv) {
    int fd = open("a.txt", O_RDWR | O_SYNC);
    std::cout << "open return fd: " << fd << std::endl;
    unsigned long offset = 0ul;
    std::cout << "page_size is: " << getpagesize() << std::endl;
    void* map_base = mmap(NULL, getpagesize(), PROT_READ | PROT_WRITE, MAP_SHARED, fd, offset);

    if (map_base == (void*) -1) {
        close(fd);
        std::cout << "fatal" << std::endl;
        return -1;
    }
    void* virt_addr = static_cast<void*>(static_cast<char*>(map_base) + (offset & MAP_MASK));
    std::cout << "memory map at base address: " << map_base << std::endl;
    std::cout << "value at address: " << virt_addr << std::endl;
    std::cout << sizeof(virt_addr) << std::endl;
    memset(virt_addr, 0, sizeof(int) * 100);
    munmap(map_base, getpagesize());
    close(fd);
    map_base = nullptr;
    virt_addr = nullptr;
}
==1725== Syscall param msg->desc.port.name points to uninitialised byte(s)
==1725==    at 0x10049734A: mach_msg_trap (in /usr/lib/system/libsystem_kernel.dylib)
==1725==    by 0x100496796: mach_msg (in /usr/lib/system/libsystem_kernel.dylib)
==1725==    by 0x100490485: task_set_special_port (in /usr/lib/system/libsystem_kernel.dylib)
==1725==    by 0x10062C10E: _os_trace_create_debug_control_port (in /usr/lib/system/libsystem_trace.dylib)
==1725==    by 0x10062C458: _libtrace_init (in /usr/lib/system/libsystem_trace.dylib)
==1725==    by 0x10015C9DF: libSystem_initializer (in /usr/lib/libSystem.B.dylib)
==1725==    by 0x10001AA1A: ImageLoaderMachO::doModInitFunctions(ImageLoader::LinkContext const&) (in /usr/lib/dyld)
==1725==    by 0x10001AC1D: ImageLoaderMachO::doInitialization(ImageLoader::LinkContext const&) (in /usr/lib/dyld)
==1725==    by 0x1000164A9: ImageLoader::recursiveInitialization(ImageLoader::LinkContext const&, unsigned int, char const*, ImageLoader::InitializerTimingList&, ImageLoader::UninitedUpwards&) (in /usr/lib/dyld)
==1725==    by 0x100016440: ImageLoader::recursiveInitialization(ImageLoader::LinkContext const&, unsigned int, char const*, ImageLoader::InitializerTimingList&, ImageLoader::UninitedUpwards&) (in /usr/lib/dyld)
==1725==    by 0x100015523: ImageLoader::processInitializers(ImageLoader::LinkContext const&, unsigned int, ImageLoader::InitializerTimingList&, ImageLoader::UninitedUpwards&) (in /usr/lib/dyld)
==1725==    by 0x1000155B8: ImageLoader::runInitializers(ImageLoader::LinkContext const&, ImageLoader::InitializerTimingList&) (in /usr/lib/dyld)
==1725==  Address 0x10488dc8c is on thread 1's stack
==1725==  in frame #2, created by task_set_special_port (???:)
==1725==  Uninitialised value was created by a stack allocation
==1725==    at 0x10062C0A6: _os_trace_create_debug_control_port (in /usr/lib/system/libsystem_trace.dylib)

==1725== LEAK SUMMARY:
==1725==    definitely lost: 0 bytes in 0 blocks
==1725==    indirectly lost: 0 bytes in 0 blocks
==1725==      possibly lost: 72 bytes in 3 blocks
==1725==    still reachable: 4,296 bytes in 7 blocks
==1725==         suppressed: 17,928 bytes in 153 blocks

这已经解决了Mac OS上的Valgrind bug

要消除此错误,您可以从当前来源构建Valgrind,请参阅

另见几乎重复的问题