Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

277
Views
Conversión no válida de uint8_t* a uint32_t: ¿al migrar de una arquitectura de 32 a 64 bits?

Tenía una pequeña función que convertía la dirección de memoria virtual en física en una arquitectura de 32 bits:

 uint32_t VIRTBASE; uint32_t getPhysForVirt(void* virt) { uint32_t offset = (uint8_t*)virt - VIRTBASE; return PHYSBASE + offset; }

Compiló y funcionó sin ningún problema en los últimos 10 años o más.

Cambié el compilador para construir el repositorio para arquitecturas más nuevas (ahora con soporte de 64 bits por primera vez).

La compilación falla indicando

conversión no válida de 'uint8_t*' {también conocido como 'char sin firmar*'} a 'uint32_t' {también conocido como 'int sin firmar'} [-fpermissive]

Ahora, entiendo el mensaje, pero no estoy seguro de los pasos necesarios para hacer esta compilación sin errores.

Solo estoy seguro de que no quiero habilitar -fpermissive .

over 4 years ago · Santiago Trujillo
2 answers
Answer question

0

Utiliza los tipos incorrectos. El lenguaje C tiene tipos especiales para convertir punteros en valores integrales.

 uintptr_t VIRTBASE; uintptr_t getPhysForVirt(const void * restrict virt) { ptrdiff_t offset = (uintptr_t)virt - VIRTBASE; return PHYSBASE + offset; }

Si el resto del código está escrito de la misma manera que esta función, tiene mucho trabajo para Navidad.

over 4 years ago · Santiago Trujillo Report

0

Está haciendo aritmética de punteros y convirtiéndola directamente en un entero sin signo de 32 bits.

En una arquitectura de 32 bits, los punteros también son números enteros sin signo de 32 bits, por lo que es probable que esto se haya manejado silenciosamente en segundo plano.

Ahora, en su arquitectura de 64 bits, está restando dos punteros de 64 bits y almacenando el resultado en un número entero de 32 bits, ¡y por lo tanto perdiendo la mitad de su dirección!

Probablemente no desee que esta función devuelva un número entero, sino un puntero a cualquier tipo de datos que esté usando (presumiblemente uint8_t*, ya que eso se indica explícitamente en la función misma).

editar: Por el contrario, ¿quizás en realidad quisiste quitar la referencia a virt y restar su valor, en lugar de hacer aritmética de punteros? Si es así, tiene el operador * en el lugar equivocado. Tratar:

 uint32_t offset = (uint8_t) *virt - VIRTBASE;

Aunque, como señaló otro comentarista, esto causaría problemas con la desreferenciación de un puntero vacío. Tendrías que lanzarlo a algo significativo primero.

over 4 years ago · Santiago Trujillo Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!