运行非阻塞TCP代码时出现memcheck错误

时间:2015-03-19 21:52:39

标签: c tcp

我正在尝试使用服务器代码中的select()实现非阻塞调用。我有5个客户端和一个服务器。    当我用valgrind运行它时,我收到以下错误。任何人都可以帮我解决我出错的地方以及如何解决这些问题?

==5311== Conditional jump or move depends on uninitialised value(s)
==5311==    at 0x1001B32E6: strnlen (in /usr/lib/system/libsystem_c.dylib)
==5311==    by 0x1001F7F10: __vfprintf (in /usr/lib/system/libsystem_c.dylib)
==5311==    by 0x1002209CE: __v2printf (in /usr/lib/system/libsystem_c.dylib)
==5311==    by 0x100220CA0: __xvprintf (in /usr/lib/system/libsystem_c.dylib)
==5311==    by 0x1001F6B91: vfprintf_l (in /usr/lib/system/libsystem_c.dylib)
==5311==    by 0x1001F49F7: printf (in /usr/lib/system/libsystem_c.dylib)
==5311==    by 0x100000ED1: main (in ./server-tcp)
==5311== 
==5311== 
==5311== Conditional jump or move depends on uninitialised value(s)
==5311==    at 0x1001F8C72: __vfprintf (in /usr/lib/system/libsystem_c.dylib)
==5311==    by 0x1002209CE: __v2printf (in /usr/lib/system/libsystem_c.dylib)
==5311==    by 0x100220CA0: __xvprintf (in /usr/lib/system/libsystem_c.dylib)
==5311==    by 0x1001F6B91: vfprintf_l (in /usr/lib/system/libsystem_c.dylib)
==5311==    by 0x1001F49F7: printf (in /usr/lib/system/libsystem_c.dylib)
==5311==    by 0x100000ED1: main (in ./server-tcp)
==5311== 
==5311== Conditional jump or move depends on uninitialised value(s)
==5311==    at 0x1001FAFF5: __vfprintf (in /usr/lib/system/libsystem_c.dylib)
==5311==    by 0x1002209CE: __v2printf (in /usr/lib/system/libsystem_c.dylib)
==5311==    by 0x100220CA0: __xvprintf (in /usr/lib/system/libsystem_c.dylib)
==5311==    by 0x1001F6B91: vfprintf_l (in /usr/lib/system/libsystem_c.dylib)
==5311==    by 0x1001F49F7: printf (in /usr/lib/system/libsystem_c.dylib)
==5311==    by 0x100000ED1: main (in ./server-tcp)
==5311== 
==5311== Conditional jump or move depends on uninitialised value(s)
==5311==    at 0x1001F0AC7: __sfvwrite (in /usr/lib/system/libsystem_c.dylib)
==5311==    by 0x1001FB005: __vfprintf (in /usr/lib/system/libsystem_c.dylib)
==5311==    by 0x1002209CE: __v2printf (in /usr/lib/system/libsystem_c.dylib)
==5311==    by 0x100220CA0: __xvprintf (in /usr/lib/system/libsystem_c.dylib)
==5311==    by 0x1001F6B91: vfprintf_l (in /usr/lib/system/libsystem_c.dylib)
==5311==    by 0x1001F49F7: printf (in /usr/lib/system/libsystem_c.dylib)
==5311==    by 0x100000ED1: main (in ./server-tcp)
==5311== 
==5311== Conditional jump or move depends on uninitialised value(s)
==5311==    at 0x1001F0C98: __sfvwrite (in /usr/lib/system/libsystem_c.dylib)
==5311==    by 0x1001FB005: __vfprintf (in /usr/lib/system/libsystem_c.dylib)
==5311==    by 0x1002209CE: __v2printf (in /usr/lib/system/libsystem_c.dylib)
==5311==    by 0x100220CA0: __xvprintf (in /usr/lib/system/libsystem_c.dylib)
==5311==    by 0x1001F6B91: vfprintf_l (in /usr/lib/system/libsystem_c.dylib)
==5311==    by 0x1001F49F7: printf (in /usr/lib/system/libsystem_c.dylib)
==5311==    by 0x100000ED1: main (in ./server-tcp)
==5311== 
==5311== Conditional jump or move depends on uninitialised value(s)
==5311==    at 0x1001F0B9F: __sfvwrite (in /usr/lib/system/libsystem_c.dylib)
==5311==    by 0x1001FB005: __vfprintf (in /usr/lib/system/libsystem_c.dylib)
==5311==    by 0x1002209CE: __v2printf (in /usr/lib/system/libsystem_c.dylib)
==5311==    by 0x100220CA0: __xvprintf (in /usr/lib/system/libsystem_c.dylib)
==5311==    by 0x1001F6B91: vfprintf_l (in /usr/lib/system/libsystem_c.dylib)
==5311==    by 0x1001F49F7: printf (in /usr/lib/system/libsystem_c.dylib)
==5311==    by 0x100000ED1: main (in ./server-tcp)
==5311== 
==5311== Conditional jump or move depends on uninitialised value(s)
==5311==    at 0x10000B19C: _platform_memchr$VARIANT$Generic (in /usr/local/Cellar/valgrind/HEAD/lib/valgrind/vgpreload_memcheck-amd64-darwin.so)
==5311==    by 0x1001F0BB6: __sfvwrite (in /usr/lib/system/libsystem_c.dylib)
==5311==    by 0x1001FB005: __vfprintf (in /usr/lib/system/libsystem_c.dylib)
==5311==    by 0x1002209CE: __v2printf (in /usr/lib/system/libsystem_c.dylib)
==5311==    by 0x100220CA0: __xvprintf (in /usr/lib/system/libsystem_c.dylib)
==5311==    by 0x1001F6B91: vfprintf_l (in /usr/lib/system/libsystem_c.dylib)
==5311==    by 0x1001F49F7: printf (in /usr/lib/system/libsystem_c.dylib)
==5311==    by 0x100000ED1: main (in ./server-tcp)
==5311== 
==5311== Conditional jump or move depends on uninitialised value(s)
==5311==    at 0x10000B1B5: _platform_memchr$VARIANT$Generic (in /usr/local/Cellar/valgrind/HEAD/lib/valgrind/vgpreload_memcheck-amd64-darwin.so)
==5311==    by 0x1001F0BB6: __sfvwrite (in /usr/lib/system/libsystem_c.dylib)
==5311==    by 0x1001FB005: __vfprintf (in /usr/lib/system/libsystem_c.dylib)
==5311==    by 0x1002209CE: __v2printf (in /usr/lib/system/libsystem_c.dylib)
==5311==    by 0x100220CA0: __xvprintf (in /usr/lib/system/libsystem_c.dylib)
==5311==    by 0x1001F6B91: vfprintf_l (in /usr/lib/system/libsystem_c.dylib)
==5311==    by 0x1001F49F7: printf (in /usr/lib/system/libsystem_c.dylib)
==5311==    by 0x100000ED1: main (in ./server-tcp)
==5311== 
==5311== Conditional jump or move depends on uninitialised value(s)
==5311==    at 0x1001F0BF8: __sfvwrite (in /usr/lib/system/libsystem_c.dylib)
==5311==    by 0x1001FB005: __vfprintf (in /usr/lib/system/libsystem_c.dylib)
==5311==    by 0x1002209CE: __v2printf (in /usr/lib/system/libsystem_c.dylib)
==5311==    by 0x100220CA0: __xvprintf (in /usr/lib/system/libsystem_c.dylib)
==5311==    by 0x1001F6B91: vfprintf_l (in /usr/lib/system/libsystem_c.dylib)
==5311==    by 0x1001F49F7: printf (in /usr/lib/system/libsystem_c.dylib)
==5311==    by 0x100000ED1: main (in ./server-tcp)
==5311== 
==5311== Conditional jump or move depends on uninitialised value(s)
==5311==    at 0x1001F0C28: __sfvwrite (in /usr/lib/system/libsystem_c.dylib)
==5311==    by 0x1001FB005: __vfprintf (in /usr/lib/system/libsystem_c.dylib)
==5311==    by 0x1002209CE: __v2printf (in /usr/lib/system/libsystem_c.dylib)
==5311==    by 0x100220CA0: __xvprintf (in /usr/lib/system/libsystem_c.dylib)
==5311==    by 0x1001F6B91: vfprintf_l (in /usr/lib/system/libsystem_c.dylib)
==5311==    by 0x1001F49F7: printf (in /usr/lib/system/libsystem_c.dylib)
==5311==    by 0x100000ED1: main (in ./server-tcp)
==5311== 
==5311== Conditional jump or move depends on uninitialised value(s)
==5311==    at 0x10000BC15: _platform_memmove$VARIANT$Ivybridge (in /usr/local/Cellar/valgrind/HEAD/lib/valgrind/vgpreload_memcheck-amd64-darwin.so)
==5311==    by 0x1001F0C37: __sfvwrite (in /usr/lib/system/libsystem_c.dylib)
==5311==    by 0x1001FB005: __vfprintf (in /usr/lib/system/libsystem_c.dylib)
==5311==    by 0x1002209CE: __v2printf (in /usr/lib/system/libsystem_c.dylib)
==5311==    by 0x100220CA0: __xvprintf (in /usr/lib/system/libsystem_c.dylib)
==5311==    by 0x1001F6B91: vfprintf_l (in /usr/lib/system/libsystem_c.dylib)
==5311==    by 0x1001F49F7: printf (in /usr/lib/system/libsystem_c.dylib)
==5311==    by 0x100000ED1: main (in ./server-tcp)
==5311== 
==5311== Conditional jump or move depends on uninitialised value(s)
==5311==    at 0x10000BD17: _platform_memmove$VARIANT$Ivybridge (in /usr/local/Cellar/valgrind/HEAD/lib/valgrind/vgpreload_memcheck-amd64-darwin.so)
==5311==    by 0x1001F0C37: __sfvwrite (in /usr/lib/system/libsystem_c.dylib)
==5311==    by 0x1001FB005: __vfprintf (in /usr/lib/system/libsystem_c.dylib)
==5311==    by 0x1002209CE: __v2printf (in /usr/lib/system/libsystem_c.dylib)
==5311==    by 0x100220CA0: __xvprintf (in /usr/lib/system/libsystem_c.dylib)
==5311==    by 0x1001F6B91: vfprintf_l (in /usr/lib/system/libsystem_c.dylib)
==5311==    by 0x1001F49F7: printf (in /usr/lib/system/libsystem_c.dylib)
==5311==    by 0x100000ED1: main (in ./server-tcp)
==5311== 
==5311== Conditional jump or move depends on uninitialised value(s)
==5311==    at 0x10000BD42: _platform_memmove$VARIANT$Ivybridge (in /usr/local/Cellar/valgrind/HEAD/lib/valgrind/vgpreload_memcheck-amd64-darwin.so)
==5311==    by 0x1001F0C37: __sfvwrite (in /usr/lib/system/libsystem_c.dylib)
==5311==    by 0x1001FB005: __vfprintf (in /usr/lib/system/libsystem_c.dylib)
==5311==    by 0x1002209CE: __v2printf (in /usr/lib/system/libsystem_c.dylib)
==5311==    by 0x100220CA0: __xvprintf (in /usr/lib/system/libsystem_c.dylib)
==5311==    by 0x1001F6B91: vfprintf_l (in /usr/lib/system/libsystem_c.dylib)
==5311==    by 0x1001F49F7: printf (in /usr/lib/system/libsystem_c.dylib)
==5311==    by 0x100000ED1: main (in ./server-tcp)
==5311== 
==5311== Conditional jump or move depends on uninitialised value(s)
==5311==    at 0x10000BD5B: _platform_memmove$VARIANT$Ivybridge (in /usr/local/Cellar/valgrind/HEAD/lib/valgrind/vgpreload_memcheck-amd64-darwin.so)
==5311==    by 0x1001F0C37: __sfvwrite (in /usr/lib/system/libsystem_c.dylib)
==5311==    by 0x1001FB005: __vfprintf (in /usr/lib/system/libsystem_c.dylib)
==5311==    by 0x1002209CE: __v2printf (in /usr/lib/system/libsystem_c.dylib)
==5311==    by 0x100220CA0: __xvprintf (in /usr/lib/system/libsystem_c.dylib)
==5311==    by 0x1001F6B91: vfprintf_l (in /usr/lib/system/libsystem_c.dylib)
==5311==    by 0x1001F49F7: printf (in /usr/lib/system/libsystem_c.dylib)
==5311==    by 0x100000ED1: main (in ./server-tcp)
==5311== 
==5311== Conditional jump or move depends on uninitialised value(s)
==5311==    at 0x1001F0C67: __sfvwrite (in /usr/lib/system/libsystem_c.dylib)
==5311==    by 0x1001FB005: __vfprintf (in /usr/lib/system/libsystem_c.dylib)
==5311==    by 0x1002209CE: __v2printf (in /usr/lib/system/libsystem_c.dylib)
==5311==    by 0x100220CA0: __xvprintf (in /usr/lib/system/libsystem_c.dylib)
==5311==    by 0x1001F6B91: vfprintf_l (in /usr/lib/system/libsystem_c.dylib)
==5311==    by 0x1001F49F7: printf (in /usr/lib/system/libsystem_c.dylib)
==5311==    by 0x100000ED1: main (in ./server-tcp)
==5311== 
==5311== Conditional jump or move depends on uninitialised value(s)
==5311==    at 0x1001F6D6D: __vfprintf (in /usr/lib/system/libsystem_c.dylib)
==5311==    by 0x1002209CE: __v2printf (in /usr/lib/system/libsystem_c.dylib)
==5311==    by 0x100220CA0: __xvprintf (in /usr/lib/system/libsystem_c.dylib)
==5311==    by 0x1001F6B91: vfprintf_l (in /usr/lib/system/libsystem_c.dylib)
==5311==    by 0x1001F49F7: printf (in /usr/lib/system/libsystem_c.dylib)
==5311==    by 0x100000ED1: main (in ./server-tcp)
==5311== 
==5311== Conditional jump or move depends on uninitialised value(s)
==5311==    at 0x1001F0BEC: __sfvwrite (in /usr/lib/system/libsystem_c.dylib)
==5311==    by 0x1001FB08C: __vfprintf (in /usr/lib/system/libsystem_c.dylib)
==5311==    by 0x1002209CE: __v2printf (in /usr/lib/system/libsystem_c.dylib)
==5311==    by 0x100220CA0: __xvprintf (in /usr/lib/system/libsystem_c.dylib)
==5311==    by 0x1001F6B91: vfprintf_l (in /usr/lib/system/libsystem_c.dylib)
==5311==    by 0x1001F49F7: printf (in /usr/lib/system/libsystem_c.dylib)
==5311==    by 0x100000ED1: main (in ./server-tcp)
==5311== 
==5311== Conditional jump or move depends on uninitialised value(s)
==5311==    at 0x1001F0BF8: __sfvwrite (in /usr/lib/system/libsystem_c.dylib)
==5311==    by 0x1001FB08C: __vfprintf (in /usr/lib/system/libsystem_c.dylib)
==5311==    by 0x1002209CE: __v2printf (in /usr/lib/system/libsystem_c.dylib)
==5311==    by 0x100220CA0: __xvprintf (in /usr/lib/system/libsystem_c.dylib)
==5311==    by 0x1001F6B91: vfprintf_l (in /usr/lib/system/libsystem_c.dylib)
==5311==    by 0x1001F49F7: printf (in /usr/lib/system/libsystem_c.dylib)
==5311==    by 0x100000ED1: main (in ./server-tcp)
==5311== 
==5311== Conditional jump or move depends on uninitialised value(s)
==5311==    at 0x10000BC1E: _platform_memmove$VARIANT$Ivybridge (in /usr/local/Cellar/valgrind/HEAD/lib/valgrind/vgpreload_memcheck-amd64-darwin.so)
==5311==    by 0x1001F0C37: __sfvwrite (in /usr/lib/system/libsystem_c.dylib)
==5311==    by 0x1001FB08C: __vfprintf (in /usr/lib/system/libsystem_c.dylib)
==5311==    by 0x1002209CE: __v2printf (in /usr/lib/system/libsystem_c.dylib)
==5311==    by 0x100220CA0: __xvprintf (in /usr/lib/system/libsystem_c.dylib)
==5311==    by 0x1001F6B91: vfprintf_l (in /usr/lib/system/libsystem_c.dylib)
==5311==    by 0x1001F49F7: printf (in /usr/lib/system/libsystem_c.dylib)
==5311==    by 0x100000ED1: main (in ./server-tcp)
==5311== 
==5311== Conditional jump or move depends on uninitialised value(s)
==5311==    at 0x10000BC23: _platform_memmove$VARIANT$Ivybridge (in /usr/local/Cellar/valgrind/HEAD/lib/valgrind/vgpreload_memcheck-amd64-darwin.so)
==5311==    by 0x1001F0C37: __sfvwrite (in /usr/lib/system/libsystem_c.dylib)
==5311==    by 0x1001FB08C: __vfprintf (in /usr/lib/system/libsystem_c.dylib)
==5311==    by 0x1002209CE: __v2printf (in /usr/lib/system/libsystem_c.dylib)
==5311==    by 0x100220CA0: __xvprintf (in /usr/lib/system/libsystem_c.dylib)
==5311==    by 0x1001F6B91: vfprintf_l (in /usr/lib/system/libsystem_c.dylib)
==5311==    by 0x1001F49F7: printf (in /usr/lib/system/libsystem_c.dylib)
==5311==    by 0x100000ED1: main (in ./server-tcp)
==5311== 
==5311== Conditional jump or move depends on uninitialised value(s)
==5311==    at 0x10000BC31: _platform_memmove$VARIANT$Ivybridge (in /usr/local/Cellar/valgrind/HEAD/lib/valgrind/vgpreload_memcheck-amd64-darwin.so)
==5311==    by 0x1001F0C37: __sfvwrite (in /usr/lib/system/libsystem_c.dylib)
==5311==    by 0x1001FB08C: __vfprintf (in /usr/lib/system/libsystem_c.dylib)
==5311==    by 0x1002209CE: __v2printf (in /usr/lib/system/libsystem_c.dylib)
==5311==    by 0x100220CA0: __xvprintf (in /usr/lib/system/libsystem_c.dylib)
==5311==    by 0x1001F6B91: vfprintf_l (in /usr/lib/system/libsystem_c.dylib)
==5311==    by 0x1001F49F7: printf (in /usr/lib/system/libsystem_c.dylib)
==5311==    by 0x100000ED1: main (in ./server-tcp)
==5311== 
==5311== Conditional jump or move depends on uninitialised value(s)
==5311==    at 0x10000BC3D: _platform_memmove$VARIANT$Ivybridge (in /usr/local/Cellar/valgrind/HEAD/lib/valgrind/vgpreload_memcheck-amd64-darwin.so)
==5311==    by 0x1001F0C37: __sfvwrite (in /usr/lib/system/libsystem_c.dylib)
==5311==    by 0x1001FB08C: __vfprintf (in /usr/lib/system/libsystem_c.dylib)
==5311==    by 0x1002209CE: __v2printf (in /usr/lib/system/libsystem_c.dylib)
==5311==    by 0x100220CA0: __xvprintf (in /usr/lib/system/libsystem_c.dylib)
==5311==    by 0x1001F6B91: vfprintf_l (in /usr/lib/system/libsystem_c.dylib)
==5311==    by 0x1001F49F7: printf (in /usr/lib/system/libsystem_c.dylib)
==5311==    by 0x100000ED1: main (in ./server-tcp)
==5311== 
==5311== Use of uninitialised value of size 8
==5311==    at 0x10000BD63: _platform_memmove$VARIANT$Ivybridge (in /usr/local/Cellar/valgrind/HEAD/lib/valgrind/vgpreload_memcheck-amd64-darwin.so)
==5311==    by 0x1001F0C37: __sfvwrite (in /usr/lib/system/libsystem_c.dylib)
==5311==    by 0x1001FB08C: __vfprintf (in /usr/lib/system/libsystem_c.dylib)
==5311==    by 0x1002209CE: __v2printf (in /usr/lib/system/libsystem_c.dylib)
==5311==    by 0x100220CA0: __xvprintf (in /usr/lib/system/libsystem_c.dylib)
==5311==    by 0x1001F6B91: vfprintf_l (in /usr/lib/system/libsystem_c.dylib)
==5311==    by 0x1001F49F7: printf (in /usr/lib/system/libsystem_c.dylib)
==5311==    by 0x100000ED1: main (in ./server-tcp)
==5311== 
==5311== Conditional jump or move depends on uninitialised value(s)
==5311==    at 0x1001EE4B7: __sflush (in /usr/lib/system/libsystem_c.dylib)
==5311==    by 0x1001F0C70: __sfvwrite (in /usr/lib/system/libsystem_c.dylib)
==5311==    by 0x1001FB08C: __vfprintf (in /usr/lib/system/libsystem_c.dylib)
==5311==    by 0x1002209CE: __v2printf (in /usr/lib/system/libsystem_c.dylib)
==5311==    by 0x100220CA0: __xvprintf (in /usr/lib/system/libsystem_c.dylib)
==5311==    by 0x1001F6B91: vfprintf_l (in /usr/lib/system/libsystem_c.dylib)
==5311==    by 0x1001F49F7: printf (in /usr/lib/system/libsystem_c.dylib)
==5311==    by 0x100000ED1: main (in ./server-tcp)
==5311== 
==5311== Syscall param write(count) contains uninitialised byte(s)
==5311==    at 0x1002FB976: write$NOCANCEL (in /usr/lib/system/libsystem_kernel.dylib)
==5311==    by 0x1001EE4C6: __sflush (in /usr/lib/system/libsystem_c.dylib)
==5311==    by 0x1001F0C70: __sfvwrite (in /usr/lib/system/libsystem_c.dylib)
==5311==    by 0x1001FB08C: __vfprintf (in /usr/lib/system/libsystem_c.dylib)
==5311==    by 0x1002209CE: __v2printf (in /usr/lib/system/libsystem_c.dylib)
==5311==    by 0x100220CA0: __xvprintf (in /usr/lib/system/libsystem_c.dylib)
==5311==    by 0x1001F6B91: vfprintf_l (in /usr/lib/system/libsystem_c.dylib)
==5311==    by 0x1001F49F7: printf (in /usr/lib/system/libsystem_c.dylib)
==5311==    by 0x100000ED1: main (in ./server-tcp)
==5311== 
Message Data: 2 0 2 0 0 0 0 
==5311== Conditional jump or move depends on uninitialised value(s)
==5311==    at 0x1001BADA1: isspace (in /usr/lib/system/libsystem_c.dylib)
==5311==    by 0x100000844: getmsg (in ./server-tcp)
==5311==    by 0x100000EEF: main (in ./server-tcp)
==5311== 
==5311== Use of uninitialised value of size 8
==5311==    at 0x1001BADAD: isspace (in /usr/lib/system/libsystem_c.dylib)
==5311==    by 0x100000844: getmsg (in ./server-tcp)
==5311==    by 0x100000EEF: main (in ./server-tcp)
==5311== 
==5311== Conditional jump or move depends on uninitialised value(s)
==5311==    at 0x100000870: getmsg (in ./server-tcp)
==5311==    by 0x100000EEF: main (in ./server-tcp)
==5311== 
==5311== Syscall param write(buf) points to uninitialised byte(s)
==5311==    at 0x1002FCC1E: write (in /usr/lib/system/libsystem_kernel.dylib)
==5311==    by 0x10015D5C8: start (in /usr/lib/system/libdyld.dylib)
==5311==  Address 0x104802eee is on thread 1's stack
==5311==  in frame #0, created by write (???:)
==5311== 

 RECEIVING ON PORT NUMBER 5919....
Socket 0 have data to read
Readline Error
Message Data: 
==5311== Invalid read of size 1
==5311==    at 0x100216879: strtol_l (in /usr/lib/system/libsystem_c.dylib)
==5311==    by 0x100000F13: main (in ./server-tcp)
==5311==  Address 0x0 is not stack'd, malloc'd or (recently) free'd

1 个答案:

答案 0 :(得分:1)

您使用if((n = read(sockfd, buffer, 1023)) <=0)从套接字读取最多1023个字节,并且在将buffer[n]传递给'\0'之前未能将buffer设置为getmsggetmsg可能会在缓冲区末尾解析并导致缓冲区溢出。

更重要的是,您认为num_wrds至少为7,并使用可能未初始化的指针atoistrcpy调用w[0]w[6]。如果从套接字读取的数据只是一个片段,这将导致未定义的行为,非常符合您的体验。

您应该缓冲从套接字读取的数据,以便一次解析完整的单词或行,并系统地检查错误。

您还应该使用snprintf而不是sprintf来避免潜在的缓冲区溢出。

您的代码中可能存在更多问题,但请先尝试修复这些问题。