parte de mi código:

int server_sockfd, client_sockfd; //socket file descriptors of client and server

//... some code 

if(pthread_create(&vlakno, NULL, handle_client, (int *) client_sockfd) != 0) {
            perror("Error while creating thread.");
        }

Estoy recibiendo «advertencia: mon puntero a enteros de diferente tamaño [-Invierno-para-puntero-cast]»

prototipo de la función:

void *handle_client(void *args);

Me encontré con esta pregunta:

enlace

La primera respuesta que dijo algo así como que él debe utilizar intptr_t en lugar de int.

Tengo dos preguntas:

¿Cuál es la diferencia entre int y intptr_t en mi caso?

¿Qué debo hacer?


Tengo 2 ideas:

1º: (cambios en el tipo de descriptores de archivo)

 int server_sockfd, client_sockfd; //socket file descriptors of client and server

    //... some code 

    if(pthread_create(&vlakno, NULL, handle_client, (intptr_t *) client_sockfd) != 0) {
                perror("Error while creating thread.");
            }

o 2ª idea: (cambiando el tipo sólo en función de conversión pthread_create)

intptr_t server_sockfd, client_sockfd; //socket file descriptors of client and server

        //... some code 

        if(pthread_create(&vlakno, NULL, handle_client, (int *) client_sockfd) != 0) {
                    perror("Error while creating thread.");
                }

EDICIÓN:

en función de handle_client yo quiero hacer esto:

int clientSocket;
clientSocket = (int)args;

Estoy realmente lo siento usuario cnicar o algo así .. que por desgracia, eliminan su respuesta, pero estaba bien.


Su solución fue utilizar (void *), en primer lugar, escayola mismo error, pero fue causado probablemente el mal comportamiento de eclipse 🙁
Así que el mensaje para él:

Ok gracias se ve muy bien eso ahora … Eclipse todavía lanzado esta advertencia, pero cuando me lo enciende y se apaga dos veces después de editarlo bien con su editar 🙂 muchas gracias

  • Cómo acerca de pasar un puntero a la FD, como en &client_sockfd?
  • por favor, mira mi edición si tus sugerencias está bien con eso. (‘m no está seguro de cuando estoy usando punteros)
InformationsquelleAutor user1097772 | 2012-02-12

3 Comentarios

  1. 6

    Se han declarado client_sockfd como un int. Usted no debe elenco que a un int * de esa manera.

    Utilizar el & operador, para obtener la dirección de client_sockfd, en cambio si se pretende dar un puntero a client_sockfd:

    pthread_create(&vlakno, NULL, handle_client, &client_sockfd)
                                              //^ & operator

    Hacer mirar hacia fuera para la vida de client_sockfd, debe sobrevivir a la rosca para evitar condiciones de carrera (ver los comentarios).


    La diferencia entre int y intptr_t es que int está destinado a mantener un número entero, mientras que intptr_t está destinado a mantener una dirección en forma de entero. intptr_t está garantizado para ser capaz de contener un puntero, mientras que int no.

    Si su intención era pasar la valor de client_sockfd, fundido a una intptr_t:

    pthread_create(&vlakno, NULL, handle_client, (intptr_t)client_sockfd)
    • Pasando &client_sockfd no es seguro a menos que se agregue la sincronización para asegurar que la persona que llama no volver antes de que el nuevo hilo, utiliza la punta de valor! OP código original era la correcta, a pesar de la advertencia, y un inútil elenco a través de uintptr_t evitaría la advertencia.
    • Debía haber mencionado la seguridad. Voy a actualizar mi respuesta.
    • Para ser claros: OP sólo en la versión tiene un bug en el oscuro compiladores donde int-a-void *-a-int viaje redondo no es seguro. Hasta donde yo sé, ningún compilador existe, ciertamente, no existe ninguno que también de soporte de hilos POSIX. Por otro lado, la versión tiene un grave condición de error en cada sistema.
    • en el mismo momento de C no es garantía de que un valor entero se conserva después de la ida si es un int y no un uintptr_t o un intptr_t.
  2. 2
    (int *) client_sockfd

    client_sockfd no es un puntero. Es un int, que no es el mismo tamaño que un int *. Y se dice que.

    El último argumento de pthread_create() es un void * y está destinado a ser un puntero a los datos que desea pasar en ese hilo en concreto. Parece que usted está tratando de convertir el valor entero de client_sockfd a un puntero y aprobar. Generalmente eso no es algo que se iba a hacer, pero si usted realmente desea y evitar la advertencia, entonces usted necesita utilizar algo que es del mismo tamaño de un puntero, que es lo que intptr_t le da. Es más que probable que int es de 4 bytes y intptr_t (y void *) es de ocho bytes en el sistema, sino que es dependiente de la plataforma. Mientras que la seguridad puede ir de 32->64->de 32 bits, el compilador es un aviso de que tienes diferentes tamaños.

    • El último argumento de pthread_create también puede pasar argumentos enteros mientras el valor se ajusta de forma segura en void * a través de la aplicación de la conversión de int a void * a int.
    • Sólo porque tú puede hacer algo no significa que usted debe. Lo que se dice … que es exactamente lo que el último párrafo de mi respuesta, dice. Voy a añadir algo más de claridad explícitamente hablar de tallas.
  3. 0

    (int *) client_sockfd no es equivalente a &client_sockfd.

    El primer convierte el valor de client_sockfd a un int * y la segunda forma se obtiene un puntero a client_sockfd.

    Es la última expresión tiene que utilizar para pthread_create último argumento.

    • Pasando &client_sockfd es incorrecta y muy inseguros, a menos que usted agregue la sincronización para asegurar que su vida no termina antes de que el nuevo hilo que se usa. OP código es correcto a pesar de la advertencia. Usted puede eliminar la advertencia con un inútil elenco a través de uintptr_t.
    • Dependiendo de cómo handle_client se implementa pasar una copia de client_sockfd convertidos a un tipo de puntero puede ser igual de mal. Con respecto a la vida del objeto client_sockfd, nada en el OP pregunta nos dice que no tiene almacenamiento estático duración o que el descriptor puede ser accedido en forma insegura.
    • Estoy suponiendo que no es estático porque estática tiempo de almacenamiento de los hilos es sólo una fórmula para escribir mierda de código. En realidad, el mismo sería cierto incluso sin la frase «por los hilos». Estoy de acuerdo, es posible que el handle_client función espera un puntero, pero lo dudo ya que el OP pregunta acerca de una advertencia y no acerca de por qué handle_client se bloquea…

Dejar respuesta

Please enter your comment!
Please enter your name here