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.
can you try to send "Bonjour" instead of "Halo" and see if the warning disappear ? 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 >