Hello Gilles,

Am Mittwoch, 2. März 2016, 23:36:56 CET schrieb Gilles Gouaillardet:
> Florian,
> 
> under the hood, strlen() can use vector instructions, and then read memory
> above the end of the string. valgrind is extremely picky and does warn
> about that.
> iirc, there are some filter options not to issue these warnings, but I
> forgot the details.

Ok, i'll try to research in that direction.

> 
> can you try to send "Bonjour" instead of "Halo" and see if the warning
> disappear ?

They are still there. But, was this meant as a joke or didn't I understand?

Best,
Florian
 
> Cheers,
> 
> Gilles
> 
> PS if it works, do not jump to the erroneous conclusion valgrind likes
> French and dislikes German ;-)
> 
> On Wednesday, March 2, 2016, Florian Lindner <mailingli...@xgm.de> wrote:
> 
> > Hello,
> >
> > using OpenMPI 1.10.2 and valgrind 3.11.0 I try to use the code below to
> > send a c++ string.
> >
> > It works fine, but running through valgrind gives a lot of memory errors,
> > invalid read of size...
> >
> > What is going wrong there?
> >
> > Valgrind output, see below.
> >
> > Thanks!
> > Florian
> >
> >
> > // Compile with: mpicxx -std=c++11 -g -O0 -Wall -Wextra mpi.cpp
> > #include <mpi.h>
> > #include <iostream>
> > #include <string>
> >
> > using namespace std;
> >
> >
> > void receive() {
> >   int length = 0;
> >   MPI_Status status;
> >   MPI_Probe(MPI_ANY_SOURCE, 0, MPI_COMM_WORLD, &status);
> >   MPI_Get_count(&status, MPI_CHAR, &length);
> >   cout << "Stringlength = " << length << endl;
> >   char cstr[length];
> >   MPI_Recv(cstr,
> >            length,
> >            MPI_CHAR,
> >            MPI_ANY_SOURCE,
> >            MPI_ANY_TAG,
> >            MPI_COMM_WORLD,
> >            MPI_STATUS_IGNORE);
> >   cout << cstr << endl;
> > }
> >
> > void send(int rankReceiver) {
> >   std::string s = "Hallo";
> >   MPI_Send(s.c_str(),
> >            s.size()+1,
> >            MPI_CHAR,
> >            rankReceiver,
> >            0,
> >            MPI_COMM_WORLD);
> > }
> >
> > int main(int argc, char* argv[])
> > {
> >   int rank;
> >   MPI_Init(&argc, &argv);
> >
> >   MPI_Comm_rank(MPI_COMM_WORLD, &rank);
> >   if (rank == 0)
> >     send(1);
> >   else {
> >     receive();
> >   }
> >   MPI_Finalize();
> >   return 0;
> > }
> >
> >
> > VALGRIND OUTPUT
> >
> > % mpicxx -std=c++11 -g -O0 -Wall -Wextra mpi.cpp && mpirun -n 2 ./a.out
> > Stringlength = 6
> > Hallo
> > florian@asaru ~/scratch (git)-[master] %
> > LD_PRELOAD=/usr/lib/valgrind/libmpiwrap-amd64-linux.so mpirun -n 2 valgrind
> > ./a.out
> > ==9290== Memcheck, a memory error detector
> > ==9290== Copyright (C) 2002-2015, and GNU GPL'd, by Julian Seward et al.
> > ==9290== Using Valgrind-3.11.0 and LibVEX; rerun with -h for copyright info
> > ==9290== Command: ./a.out
> > ==9290==
> > ==9291== Memcheck, a memory error detector
> > ==9291== Copyright (C) 2002-2015, and GNU GPL'd, by Julian Seward et al.
> > ==9291== Using Valgrind-3.11.0 and LibVEX; rerun with -h for copyright info
> > ==9291== Command: ./a.out
> > ==9291==
> > valgrind MPI wrappers  9290: Active for pid 9290
> > valgrind MPI wrappers  9291: Active for pid 9291
> > valgrind MPI wrappers  9290: Try MPIWRAP_DEBUG=help for possible options
> > valgrind MPI wrappers  9291: Try MPIWRAP_DEBUG=help for possible options
> > Stringlength = 6
> > ==9291== Invalid read of size 1
> > ==9291==    at 0x4C2DBA2: strlen (in
> > /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
> > ==9291==    by 0x56852D8: length (char_traits.h:267)
> > ==9291==    by 0x56852D8: std::basic_ostream<char, std::char_traits<char>
> > >& std::operator<< <std::char_traits<char> >(std::basic_ostream<char,
> > std::char_traits<char> >&, char const*) (ostream:562)
> > ==9291==    by 0x408A39: receive() (mpi.cpp:22)
> > ==9291==    by 0x408B61: main (mpi.cpp:46)
> > ==9291==  Address 0xffefff870 is on thread 1's stack
> > ==9291==  in frame #2, created by receive() (mpi.cpp:8)
> > ==9291==
> > ==9291== Invalid read of size 1
> > ==9291==    at 0x4C2DBB4: strlen (in
> > /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
> > ==9291==    by 0x56852D8: length (char_traits.h:267)
> > ==9291==    by 0x56852D8: std::basic_ostream<char, std::char_traits<char>
> > >& std::operator<< <std::char_traits<char> >(std::basic_ostream<char,
> > std::char_traits<char> >&, char const*) (ostream:562)
> > ==9291==    by 0x408A39: receive() (mpi.cpp:22)
> > ==9291==    by 0x408B61: main (mpi.cpp:46)
> > ==9291==  Address 0xffefff871 is on thread 1's stack
> > ==9291==  in frame #2, created by receive() (mpi.cpp:8)
> > ==9291==
> > ==9291== Invalid read of size 1
> > ==9291==    at 0x60A0FF1: _IO_file_xsputn@@GLIBC_2.2.5 (in /usr/lib/
> > libc-2.23.so)
> > ==9291==    by 0x6096D1A: fwrite (in /usr/lib/libc-2.23.so)
> > ==9291==    by 0x5684F75: sputn (streambuf:451)
> > ==9291==    by 0x5684F75: __ostream_write<char, std::char_traits<char> >
> > (ostream_insert.h:50)
> > ==9291==    by 0x5684F75: std::basic_ostream<char, std::char_traits<char>
> > >& std::__ostream_insert<char, std::char_traits<char>
> > >(std::basic_ostream<char, std::char_traits<char> >&, char const*, long)
> > (ostream_insert.h:101)
> > ==9291==    by 0x56852E6: std::basic_ostream<char, std::char_traits<char>
> > >& std::operator<< <std::char_traits<char> >(std::basic_ostream<char,
> > std::char_traits<char> >&, char const*) (ostream:561)
> > ==9291==    by 0x408A39: receive() (mpi.cpp:22)
> > ==9291==    by 0x408B61: main (mpi.cpp:46)
> > ==9291==  Address 0xffefff874 is on thread 1's stack
> > ==9291==  in frame #4, created by receive() (mpi.cpp:8)
> > ==9291==
> > ==9291== Invalid read of size 1
> > ==9291==    at 0x60A100D: _IO_file_xsputn@@GLIBC_2.2.5 (in /usr/lib/
> > libc-2.23.so)
> > ==9291==    by 0x6096D1A: fwrite (in /usr/lib/libc-2.23.so)
> > ==9291==    by 0x5684F75: sputn (streambuf:451)
> > ==9291==    by 0x5684F75: __ostream_write<char, std::char_traits<char> >
> > (ostream_insert.h:50)
> > ==9291==    by 0x5684F75: std::basic_ostream<char, std::char_traits<char>
> > >& std::__ostream_insert<char, std::char_traits<char>
> > >(std::basic_ostream<char, std::char_traits<char> >&, char const*, long)
> > (ostream_insert.h:101)
> > ==9291==    by 0x56852E6: std::basic_ostream<char, std::char_traits<char>
> > >& std::operator<< <std::char_traits<char> >(std::basic_ostream<char,
> > std::char_traits<char> >&, char const*) (ostream:561)
> > ==9291==    by 0x408A39: receive() (mpi.cpp:22)
> > ==9291==    by 0x408B61: main (mpi.cpp:46)
> > ==9291==  Address 0xffefff873 is on thread 1's stack
> > ==9291==  in frame #4, created by receive() (mpi.cpp:8)
> > ==9291==
> > ==9291== Invalid read of size 2
> > ==9291==    at 0x4C2F9C0: __GI_memcpy (in
> > /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
> > ==9291==    by 0x60A0F3A: _IO_file_xsputn@@GLIBC_2.2.5 (in /usr/lib/
> > libc-2.23.so)
> > ==9291==    by 0x6096D1A: fwrite (in /usr/lib/libc-2.23.so)
> > ==9291==    by 0x5684F75: sputn (streambuf:451)
> > ==9291==    by 0x5684F75: __ostream_write<char, std::char_traits<char> >
> > (ostream_insert.h:50)
> > ==9291==    by 0x5684F75: std::basic_ostream<char, std::char_traits<char>
> > >& std::__ostream_insert<char, std::char_traits<char>
> > >(std::basic_ostream<char, std::char_traits<char> >&, char const*, long)
> > (ostream_insert.h:101)
> > ==9291==    by 0x56852E6: std::basic_ostream<char, std::char_traits<char>
> > >& std::operator<< <std::char_traits<char> >(std::basic_ostream<char,
> > std::char_traits<char> >&, char const*) (ostream:561)
> > ==9291==    by 0x408A39: receive() (mpi.cpp:22)
> > ==9291==    by 0x408B61: main (mpi.cpp:46)
> > ==9291==  Address 0xffefff870 is on thread 1's stack
> > ==9291==  in frame #5, created by receive() (mpi.cpp:8)
> > ==9291==
> > ==9291== Invalid read of size 1
> > ==9291==    at 0x4C2F9F8: __GI_memcpy (in
> > /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
> > ==9291==    by 0x60A0F3A: _IO_file_xsputn@@GLIBC_2.2.5 (in /usr/lib/
> > libc-2.23.so)
> > ==9291==    by 0x6096D1A: fwrite (in /usr/lib/libc-2.23.so)
> > ==9291==    by 0x5684F75: sputn (streambuf:451)
> > ==9291==    by 0x5684F75: __ostream_write<char, std::char_traits<char> >
> > (ostream_insert.h:50)
> > ==9291==    by 0x5684F75: std::basic_ostream<char, std::char_traits<char>
> > >& std::__ostream_insert<char, std::char_traits<char>
> > >(std::basic_ostream<char, std::char_traits<char> >&, char const*, long)
> > (ostream_insert.h:101)
> > ==9291==    by 0x56852E6: std::basic_ostream<char, std::char_traits<char>
> > >& std::operator<< <std::char_traits<char> >(std::basic_ostream<char,
> > std::char_traits<char> >&, char const*) (ostream:561)
> > ==9291==    by 0x408A39: receive() (mpi.cpp:22)
> > ==9291==    by 0x408B61: main (mpi.cpp:46)
> > ==9291==  Address 0xffefff874 is on thread 1's stack
> > ==9291==  in frame #5, created by receive() (mpi.cpp:8)
> > ==9291==
> > Hallo
> > ==9291==
> > ==9291== HEAP SUMMARY:
> > ==9291==     in use at exit: 96,351 bytes in 247 blocks
> > ==9291==   total heap usage: 15,020 allocs, 14,773 frees, 13,362,383 bytes
> > allocated
> > ==9291==
> > ==9291== LEAK SUMMARY:
> > ==9291==    definitely lost: 9,154 bytes in 39 blocks
> > ==9291==    indirectly lost: 4,008 bytes in 22 blocks
> > ==9291==      possibly lost: 0 bytes in 0 blocks
> > ==9291==    still reachable: 83,189 bytes in 186 blocks
> > ==9291==         suppressed: 0 bytes in 0 blocks
> > ==9291== Rerun with --leak-check=full to see details of leaked memory
> > ==9291==
> > ==9291== For counts of detected and suppressed errors, rerun with: -v
> > ==9291== ERROR SUMMARY: 14 errors from 6 contexts (suppressed: 0 from 0)
> > ==9290==
> > ==9290== HEAP SUMMARY:
> > ==9290==     in use at exit: 96,351 bytes in 247 blocks
> > ==9290==   total heap usage: 15,018 allocs, 14,771 frees, 13,370,045 bytes
> > allocated
> > ==9290==
> > ==9290== LEAK SUMMARY:
> > ==9290==    definitely lost: 9,154 bytes in 39 blocks
> > ==9290==    indirectly lost: 4,008 bytes in 22 blocks
> > ==9290==      possibly lost: 0 bytes in 0 blocks
> > ==9290==    still reachable: 83,189 bytes in 186 blocks
> > ==9290==         suppressed: 0 bytes in 0 blocks
> > ==9290== Rerun with --leak-check=full to see details of leaked memory
> > ==9290==
> > ==9290== For counts of detected and suppressed errors, rerun with: -v
> > ==9290== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 0 from 0)
> >
> > _______________________________________________
> > users mailing list
> > us...@open-mpi.org <javascript:;>
> > Subscription: http://www.open-mpi.org/mailman/listinfo.cgi/users
> > Link to this post:
> > http://www.open-mpi.org/community/lists/users/2016/03/28617.php
> >
> 

Reply via email to