2014-04-29 3 views
0

내가 곤혹 스럽습니다. 학교 지정을 위해 작은 데이터 서버에서 작업 중이며,이 반복을 위해 소켓을 통해 통신해야합니다. 그것의 대부분은 작동하지만 valgrind가 불평하는 것이 무엇인지 알 수는 없지만, 모두 그것이 말하고있는 것이 있습니다.Valgrind 배정시 오류가 발생했습니다.

valgrind says;

Conditional jump or move depends on uninitialised value(s) 
at 0x4C2ABD9: strlen (in /usr/lib64/valgrind/vgpreload_memcheck-amd64-linux.so) 
by 0x510F0EF: std::basic_string<char, std::char_traits<char>, std::allocator<char>    >::basic_string(char const*, std::allocator<char> const&) (in /usr/lib64/libstdc++.so.6.0.17) 
by 0x4078C9: netreq::cread() (netreq.c:120) 
by 0x402585: event(void*) (simpleclient.C:166) 

gdb는 프로세스의 동일한 지점에서 SIGPIPE를 수신하고 있습니다.

다음은 불만을 제기하는 기능입니다.

string netreq::cread() 
{ 
    char buf[255]; 

    if(read(fd,buf, 255) < 0) 
     cout << "I cants read dat right, sorry"<<endl; 

    return (string)buf; //this is line 120 in netreq.c 
} 

생각? 아무도 비슷한 것을 고쳤습니까? 나는 꽤 많은 일을 시도했지만 아직 운이 없다.

+0

'읽기'기능은 무엇입니까? – 101010

+0

그'read()'호출의 결과를 저장하십시오. 기능이 실패하지 않으면 당신은 그것을 필요로 할 것입니다. 그리고 그 과정에서 그 읽기를 ** 254 **로 제한하고 싶을 수도 있습니다. – WhozCraig

+0

@ 40two, 아마도 POSIX 함수'read'입니다. –

답변

1

read() 끝을 나타내는 \0으로 배열을 종료하지 않습니다. 너 혼자해야 해.

int len; 
if ((len = read(fd, buf, 255)) < 0) { 
/* ... */ 
} else { 
    buf[len] = '\0'; 
} 

return string(buf); 
+0

+1하지만,'read()'가 버퍼를 최대로 채우면 배열을 오버런시킬 것입니다. 건네받은 max-len는'sizeof (buf) -1'이어야합니다. – WhozCraig

+0

이 문제를 해결 한 것으로 보입니다. 감사합니다. 나는 이것과 비슷한 것에 대한 나의 시도가 그것을 잘라 내지 않았다고 생각한다. –