al definir constantes, ¿es #define más seguro que estático const?

3

Quiero tener algunos valores constantes en mi programa, por ejemplo, tengo un valor constante TimeLimit en un encabezado que se usa comúnmente en otras clases, pero no sé si

#define TimeLimit 30

es más seguro que

static const int TimeLimit=30;

Originalmente, quiero usar const estática porque puede causar menos tiempo de compilación cuando se cambia el valor, pero después de considerar la seguridad sospecho que debo # definir para mejorar la seguridad.

¿es cierto que #define es más seguro que la constante estática porque:

  1. "#define" está incrustado en el código compilado, mientras que el int estático deja una variable en la memoria, en la cual un usuario puede cambiar fácilmente el valor de TimeLimit en el contenido de la memoria

  2. Si usa constantes estáticas, es más fácil para el usuario saber el valor de TimeLimit porque extraer el valor de la memoria es más fácil que extraerlo del código compilado.

es eso correcto?

    
pregunta ggrr 15.01.2016 - 04:49
fuente

2 respuestas

3

static const es más seguro, pero no por las razones que estás pensando. Permite al compilador realizar una comprobación de tipos, que detectará una clase de errores que #define no permitirá que detecte.

En lo que respecta a sus preocupaciones específicas:

  

"#define" está incrustado en el código compilado, mientras que static int deja una variable en la memoria, en la que un usuario puede cambiar el valor de TimeLimit en el contenido de la memoria fácilmente

     

Si utiliza constantes estáticas, es más fácil para el usuario conocer el valor de TimeLimit porque extraer el valor de la memoria es más fácil que extraer el código compilado.

En teoría, esto es cierto. En la práctica, cada compilador en uso generalizado actual compilará los dos casos de manera idéntica (reglas de dar o tomar inferencia de tipo). En mis pruebas con GCC, tanto un #define como un static const se convirtieron en el siguiente ensamblado:

movl    $30, %eax

es decir. mueva el valor literal 30 al registro EAX en preparación para realizar una operación en él.

Ahora, hay una excepción a esto: si está compilando con información de depuración, puede haber un valor de static const en la información de depuración donde no lo hará un #define . Pero no debería enviar versiones de software de depuración a nadie en quien no confíe, o la mayoría de las personas en las que confía, en este caso.

    
respondido por el Mark 15.01.2016 - 09:49
fuente
0

Según mi entendimiento, #define reemplazará TimeLimit con el literal 30 cuando se ejecute el preprocesador. No me queda claro qué indica el estándar en las variables static const (en todo caso). Por ejemplo, si el compilador admite plegamiento constante y la variable solo se usa en expresiones constantes, las expresiones se evalúan en tiempo de compilación y no me queda claro si esa variable estará en el segmento de datos (global) de la memoria.

Me imagino que si tienes un adversario dedicado que tiene acceso a tu binario, podrán aplicar ingeniería inversa a estos valores. Creo que una mejor opción para las variables sensibles podría ser usar std::getenv y almacenar estos valores como variables de entorno. Sin embargo, si el adversario realmente tiene acceso a sus archivos binarios, también puede tener acceso a sus variables de entorno, por lo que es posible que desee aclarar su modelo de amenaza.

    
respondido por el puzzlepalace 15.01.2016 - 05:12
fuente

Lea otras preguntas en las etiquetas