2015-01-04 27 views
0

下面的代码工作正常,但是当用Valgrind的运行它会报告错误“大小8的无效读”。Valgrind的报告上的boost ::文件系统大小为8的无效读::路径:: PARENT_PATH()

#include <iostream> 
#include <boost/filesystem.hpp> 
#include <boost/program_options/options_description.hpp> 
#include <boost/program_options/parsers.hpp> 
#include <boost/program_options/variables_map.hpp> 

namespace po = boost::program_options; 

int main(int argc, char* argv[]) 
{ 
    po::options_description desc("Allowed options"); 
    desc.add_options() 
      ("report,r", po::value<std::string>(), "single input image"); 
    po::variables_map vm; 
    po::store(po::parse_command_line(argc, argv, desc), vm); 
    po::notify(vm); 
    if(vm.count("report")){ 
     boost::filesystem::path reportFile = boost::filesystem::path(vm["report"].as<std::string>()); 
     boost::filesystem::path reportPath = reportFile.parent_path(); 
     std::string reportParentPath = reportPath.string(); 
     std::cout << reportParentPath << std::endl; 
    } 
} 

当带参数./boostFilesystemTest -r folder/file.html的PROGRAMM回报 '文件夹'(如预期)运行:

什么的valgrind报告:

==23831== Memcheck, a memory error detector 
==23831== Copyright (C) 2002-2011, and GNU GPL'd, by Julian Seward et al. 
==23831== Using Valgrind-3.7.0 and LibVEX; rerun with -h for copyright info 
==23831== Command: ./boostFilesystemTest -r folder/file.html 
==23831== 
folder 
==23831== Invalid read of size 8 
==23831== at 0x63CEBC0: wcscmp (in /lib64/libc-2.15.so) 
==23831== by 0x5B9E4C3: std::moneypunct<wchar_t, false>::~moneypunct() (in /usr/lib64/libstdc++.so.6.0.17) 
==23831== by 0x5B9E548: std::moneypunct<wchar_t, false>::~moneypunct() (in /usr/lib64/libstdc++.so.6.0.17)  
==23831== by 0x5B936B4: std::locale::_Impl::~_Impl() (in /usr/lib64/libstdc++.so.6.0.17)       
==23831== by 0x5B937EC: std::locale::~locale() (in /usr/lib64/libstdc++.so.6.0.17)        
==23831== by 0x636BC4E: __cxa_finalize (in /lib64/libc-2.15.so)             
==23831== by 0x5708272: ??? (in /usr/lib64/libboost_filesystem.so.1.49.0)           
==23831== by 0x400EDDE: _dl_fini (in /lib64/ld-2.15.so)               
==23831== by 0x636B8B0: __run_exit_handlers (in /lib64/libc-2.15.so)            
==23831== by 0x636B934: exit (in /lib64/libc-2.15.so)                
==23831== by 0x635545B: (below main) (in /lib64/libc-2.15.so)              
==23831== Address 0x6906668 is 0 bytes after a block of size 8 alloc'd            
==23831== at 0x4C2A147: operator new[](unsigned long) (in /usr/lib64/valgrind/vgpreload_memcheck-amd64-linux.so) 
==23831== by 0x5B9E1A9: std::moneypunct<wchar_t, false>::_M_initialize_moneypunct(__locale_struct*, char const*) (in /usr/lib64/libstdc++.so.6.0.17)                     
==23831== by 0x5B95BE6: std::locale::_Impl::_Impl(char const*, unsigned long) (in /usr/lib64/libstdc++.so.6.0.17) 
==23831== by 0x5B96689: std::locale::locale(char const*) (in /usr/lib64/libstdc++.so.6.0.17)      
==23831== by 0x571348E: boost::filesystem3::path::wchar_t_codecvt_facet() (in /usr/lib64/libboost_filesystem.so.1.49.0)                            
==23831== by 0x5714A34: boost::filesystem3::path::parent_path() const (in /usr/lib64/libboost_filesystem.so.1.49.0)                             
==23831== by 0x405CDF: main (main.cpp:19)                   
==23831==                           
==23831== Invalid read of size 8                      
==23831== at 0x63CEBC0: wcscmp (in /lib64/libc-2.15.so)               
==23831== by 0x5B9E3B3: std::moneypunct<wchar_t, true>::~moneypunct() (in /usr/lib64/libstdc++.so.6.0.17)   
==23831== by 0x5B9E438: std::moneypunct<wchar_t, true>::~moneypunct() (in /usr/lib64/libstdc++.so.6.0.17)   
==23831== by 0x5B936B4: std::locale::_Impl::~_Impl() (in /usr/lib64/libstdc++.so.6.0.17)       
==23831== by 0x5B937EC: std::locale::~locale() (in /usr/lib64/libstdc++.so.6.0.17) 
==23831== by 0x636BC4E: __cxa_finalize (in /lib64/libc-2.15.so) 
==23831== by 0x5708272: ??? (in /usr/lib64/libboost_filesystem.so.1.49.0) 
==23831== by 0x400EDDE: _dl_fini (in /lib64/ld-2.15.so) 
==23831== by 0x636B8B0: __run_exit_handlers (in /lib64/libc-2.15.so) 
==23831== by 0x636B934: exit (in /lib64/libc-2.15.so) 
==23831== by 0x635545B: (below main) (in /lib64/libc-2.15.so) 
==23831== Address 0x6906898 is 0 bytes after a block of size 8 alloc'd 
==23831== at 0x4C2A147: operator new[](unsigned long) (in /usr/lib64/valgrind/vgpreload_memcheck-amd64-linux.so) 
==23831== by 0x5B9DC19: std::moneypunct<wchar_t, true>::_M_initialize_moneypunct(__locale_struct*, char const*) (in /usr/lib64/libstdc++.so.6.0.17) 
==23831== by 0x5B95C33: std::locale::_Impl::_Impl(char const*, unsigned long) (in /usr/lib64/libstdc++.so.6.0.17) 
==23831== by 0x5B96689: std::locale::locale(char const*) (in /usr/lib64/libstdc++.so.6.0.17) 
==23831== by 0x571348E: boost::filesystem3::path::wchar_t_codecvt_facet() (in /usr/lib64/libboost_filesystem.so.1.49.0) 
==23831== by 0x5714A34: boost::filesystem3::path::parent_path() const (in /usr/lib64/libboost_filesystem.so.1.49.0) 
==23831== by 0x405CDF: main (main.cpp:19) 
==23831== 
==23831== 
==23831== HEAP SUMMARY: 
==23831==  in use at exit: 0 bytes in 0 blocks 
==23831== total heap usage: 539 allocs, 539 frees, 35,943 bytes allocated 
==23831== 
==23831== All heap blocks were freed -- no leaks are possible 
==23831== 
==23831== For counts of detected and suppressed errors, rerun with: -v 
==23831== ERROR SUMMARY: 2 errors from 2 contexts (suppressed: 2 from 2) 

我没有看到这个“大小8的无效读“来自以及代码如何修复。有人有想法吗?

我在openSuse 12.2上使用了boost 1.49.0。

编辑

LANG=C与运行Valgrind的测试时不会产生尺寸为8的无效读取。这个原因对我来说是未知的。

+0

要知道,有些编译器和库优化可能会导致无效的读取和使用未分配的堆栈空间的临时空间(可以验证它不是由一个代码错误引起的后忽略,比如写靠近堆栈的顶部警告将错误的指针传递给库)。 – user2672165

+1

它看起来与语言环境有关。尝试用'LANG = C'或许去比较 – sehe

+0

你为什么认为它与本地有关? 'LANG = C'确实不会显示任何无效的读取。 – Sjoerd222888

回答

-1

正如sehe评论说,这是真正的语言环境有关。在使用valgrind进行测试时,使用LANG=C运行时不会产生大小为8的无效读取。

+0

好吧,这使得错误更加精确,但它不能解释它。 – akim

+0

确实。如果您有解释请分享。 – Sjoerd222888

+0

对不起,我不是说我有答案。只是我也在寻找它。 – akim