내 코드에서 메모리 누수를 찾기 위해 Valgrind을 사용했지만 메모리 누수가없는 동안 일부 오류는 모두 하나의 함수/클래스 메소드 :"초기화되지 않은 바이트 (들) 가리 킵니다."Valgrind 오류
//...
typedef struct{
char type;
double value;
} MESSAGE;
//...
int unix_socket::sendMsg(const char _type, const double _value){
MESSAGE msg;
msg.type=_type;
msg.value=_value;
int n = send(client_sock, &msg, sizeof(msg), 0);
if (n < 0) {
perror("send");
return -1;
}
c_sent=msg.type;
v_sent=msg.value;
return 0;
}
나는 문제가 무엇인지 볼 수 없습니다 : 오류가 가리키는 것을
sendMsg(const char _type, const double _value)
==17043== ERROR SUMMARY: 10100 errors from 3 contexts (suppressed: 0 from 0)
==17043==
==17043== 100 errors in context 1 of 3:
==17043== Syscall param socketcall.sendto(msg) points to uninitialised byte(s)
==17043== at 0x5441DA2: send (send.c:28)
==17043== by 0x404C2D: unix_socket::sendMsg(char, double) (in /home/joao/CloudPT/Bolsa/Webots/controllers/darwin-pi2/client)
==17043== by 0x404F1C: unix_socket::sendVectorXd(Eigen::Matrix<double, -1, 1, 0, -1, 1> const&) (in /home/joao/CloudPT/Bolsa/Webots/controllers/darwin-pi2/client)
==17043== by 0x401F2A: main (in /home/joao/CloudPT/Bolsa/Webots/controllers/darwin-pi2/client)
==17043== Address 0x7feffff61 is on thread 1's stack
==17043== Uninitialised value was created by a stack allocation
==17043== at 0x404BE6: unix_socket::sendMsg(char, double) (in /home/joao/CloudPT/Bolsa/Webots/controllers/darwin-pi2/client)
==17043==
==17043==
==17043== 100 errors in context 2 of 3:
==17043== Syscall param socketcall.sendto(msg) points to uninitialised byte(s)
==17043== at 0x5441DA2: send (send.c:28)
==17043== by 0x404C2D: unix_socket::sendMsg(char, double) (in /home/joao/CloudPT/Bolsa/Webots/controllers/darwin-pi2/client)
==17043== by 0x404E8A: unix_socket::sendVectorXd(Eigen::Matrix<double, -1, 1, 0, -1, 1> const&) (in /home/joao/CloudPT/Bolsa/Webots/controllers/darwin-pi2/client)
==17043== by 0x401F2A: main (in /home/joao/CloudPT/Bolsa/Webots/controllers/darwin-pi2/client)
==17043== Address 0x7feffff61 is on thread 1's stack
==17043== Uninitialised value was created by a stack allocation
==17043== at 0x404BE6: unix_socket::sendMsg(char, double) (in /home/joao/CloudPT/Bolsa/Webots/controllers/darwin-pi2/client)
==17043==
==17043==
==17043== 9900 errors in context 3 of 3:
==17043== Syscall param socketcall.sendto(msg) points to uninitialised byte(s)
==17043== at 0x5441DA2: send (send.c:28)
==17043== by 0x404C2D: unix_socket::sendMsg(char, double) (in /home/joao/CloudPT/Bolsa/Webots/controllers/darwin-pi2/client)
==17043== by 0x404EE8: unix_socket::sendVectorXd(Eigen::Matrix<double, -1, 1, 0, -1, 1> const&) (in /home/joao/CloudPT/Bolsa/Webots/controllers/darwin-pi2/client)
==17043== by 0x401F2A: main (in /home/joao/CloudPT/Bolsa/Webots/controllers/darwin-pi2/client)
==17043== Address 0x7feffff61 is on thread 1's stack
==17043== Uninitialised value was created by a stack allocation
==17043== at 0x404BE6: unix_socket::sendMsg(char, double) (in /home/joao/CloudPT/Bolsa/Webots/controllers/darwin-pi2/client)
==17043==
==17043== ERROR SUMMARY: 10100 errors from 3 contexts (suppressed: 0 from 0)
, unix_socket
클래스의 일부이다. 초기화되지 않은 값은 정확히 어디에 있습니까? 아니면 Valgrind가보고 한 오류를 무시해야합니까? MESSAGE
구조체에
대안으로 바이트 벡터에 구조체를 압축하여 보내고 각 요소의 정확한 크기로 조인다. 구조체 형태로 와이어를 통해 구조를 전송하는 것은 절대로 큰 아이디어가 아닙니다.현재 메커니즘을 읽는 클라이언트는 패딩 구조가 무엇인지 알 수 없기 때문에 결과적으로 'value'가 1 바이트, 2 바이트, 4 바이트 또는 8 바이트로 정렬되는지 여부를 알 수 없습니다 . 이 코드를 작성하려면 길이 결정 프로토콜을 사용하고 값이 올바른지 확인하여 팩 및 압축 해제 코드를 모두 가져야 정렬 문제가 해결됩니다. – WhozCraig
당신은 라이트입니다. 그러나 그대로두면 어떤 단점이 발생할 수 있습니까? – joaocandre
@WhozCraig 두 개의 다른 프로그램간에 데이터를 공유하기 위해 Unix 소켓으로 사용하고 있습니다. 문제가 될만한가? – joaocandre