[해결방법] pointer targets in passing argument 6 of ‘recvfrom’ differ in signedness

This topic contains 0 replies, has 1 voice, and was last updated by  technote 2017-10-17 18:28.

Viewing 1 post (of 1 total)
  • Author
    Posts
  • #59

    technote
    Keymaster

    에러는 아니지만 아래와 같이 warning log 가 발생하는 경우가 있다.

    warning: pointer targets in passing argument 6 of ‘recvfrom’ differ in signedness [-Wpointer-sign]

    nbyte = recvfrom(s, (char *)databox, sizeof(databox), 0, (struct sockaddr *)&servaddr, &addrlen); ^

    In file included from /usr/include/x86_64-linux-gnu/sys/socket.h:280:0,
    from /usr/src/wpa-2.1/src/utils/includes.h:40,
    from ctrl_iface.c:9:

    /usr/include/x86_64-linux-gnu/bits/socket2.h:64:1: note: expected ‘socklen_t * __restrict__’ but argument is of type ‘int *’
    recvfrom (int __fd, void *__restrict __buf, size_t __n, int __flags, ^

    pointer targets in passing argument 6 of ‘recvfrom’ differ in signedness warning이 발생하는 이유는 무엇인가?

    recvfrom의 man page를 보면 api 사용 정의가 다음과 같이 되어 있다.

    ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags, struct sockaddr *src_addr, socklen_t *addrlen);

    에러 발생상황 당시의 변수 type을 살펴보자

    int s; unsigned char databox[FRAME_SIZE]; struct sockaddr_in servaddr; int addrlen; nbyte = recvfrom(s, (char *)databox, sizeof(databox), 0, (struct sockaddr *)&servaddr, &addrlen);

    api definition 과 맞지 않는 부분이 한군데 있다.
    int로 선언되어 있는 addrlen이다.
    이 부분을 int 에서 socklen_t 로 바꾸어보자
    Warning 이 사라졌다.

    그렇다면 socklen_t는 무엇인가?
    각종 header 파일을 따라가보면 다음과 같다.

    typedef __socklen_t socklen_t; __STD_TYPE __U32_TYPE __socklen_t; #define __U32_TYPE unsigned int

    결국 socklen_t 는 unsigned int 이다.
    unsigned int를 써야할 곳에 (signed) int 를 사용하였기에 아래 warning이 발생하였었던 것이다.
    pointer targets in passing argument 6 of ‘recvfrom’ differ in signedness

    warning 메세지가 정확하다.
    6번째 인자의 signedness가 다르다는 정보.

    • This topic was modified 1 year, 1 month ago by  technote.
    • This topic was modified 1 year ago by  technote.

Viewing 1 post (of 1 total)

You must be logged in to reply to this topic.