que not declared c++ c deobfuscation

c++ - not - ¿Por qué usar ''function address== NULL'' en lugar de ''false''?



nullptr que es (2)

Navegando entre algunos códigos heredados he encontrado tal función:

static inline bool EmptyFunc() { return (void*) EmptyFunc == NULL; }

¿Cuáles son las diferencias con esta:

static inline bool EmptyFunc() { return false; }

Este código fue creado para compilar en varias plataformas diferentes, como PS2, Wii, PC ... ¿Hay alguna razón para usar la primera función? ¿Te gusta una mejor optimización o evitar algún mal comportamiento extraño del compilador?


Hablando estrictamente, un puntero de función no se puede convertir en un puntero de vacío, lo que sucede entonces está fuera del alcance de la norma. El estándar C11 lo enumera como una "extensión común" en J.5.7 (sospecho que lo mismo se aplica en C ++). Así que la única diferencia entre los dos casos en que el primero no es portátil.

Parecería que la causa más probable de la versión anterior es un programador confundido o un compilador confundido. Podemos decir con certeza que el programador estaba confundido / descuidado por la falta de un comentario explicativo.

Realmente no tiene mucho sentido declarar una función como en inline y luego tratar de engañar al compilador para que no ingrese el código al incluir la dirección de la función en el código. Así que creo que podemos descartar esa teoría, a menos que, por supuesto, el programador estuviera confundido y pensara que tenía sentido.


Semánticamente, ambas funciones son iguales: siempre devuelven falso *. Doblar la primera expresión a un valor constante "falso" está completamente permitido por el estándar, ya que no cambiaría ningún efecto secundario observable (de los cuales no hay ninguno). Dado que el compilador ve la función completa, también es libre de optimizar cualquier llamada y reemplazarla con un valor "falso" constante.

Es decir, no hay un valor "general" en la primera forma y es probable que sea un error por parte del programador. La única posibilidad es que explota algún comportamiento especial (o defecto) en un compilador / versión específica. Para qué fin no sé sin embargo. Si desea evitar que el inline usando un atributo específico del compilador sería el enfoque correcto, cualquier otra cosa es propensa a romperse si el compilador cambia.

(* Esto supone que NULL nunca se define como EmptyFunc , lo que daría como resultado que se devuelva true ).