Cómo hacer una función segura en C sin usar la palabra clave estática

Kirolos William

>> Por seguro me refiero a una función que solo tiene alcance en su archivo. Ningún otro archivo puede acceder a él bajo ninguna condición <<

Bien, ahora que está claro …

Nunca he oído hablar de otra forma en C que no sea el uso de estática. Para permanecer “oculto” no debe ingresarse en la tabla de símbolos global que el enlazador utiliza para resolver direcciones entre módulos.

Quizás algunos compiladores tienen pragmas que harán esto, pero no recuerdo haberlo visto.

Por supuesto, si realmente quieres ponerte difícil, siempre puedes hacer algo como ocultar tu función (en el código de la máquina, por supuesto) dentro de un bloque de “datos” globales, y luego asignar un puntero de función para señalarlo en tiempo de ejecución (recordando para agregar cualquier código de entrada / salida requerido), o una de las muchas variaciones posibles sobre ese mismo tema. No hay razón para que esto no funcione, se solía hacer regularmente en los primeros días de la PC con el lenguaje BASIC (ocultar el código dentro de una declaración “REM”, o dentro de una cadena, era una técnica muy utilizada) .

Sin embargo, debo dejar constancia de que esto es algo que NUNCA haría en un código que me pagan para escribir, solo en mi propio código personal (hobby) (a menos que mi cliente o empleador me lo indique específicamente) )

Los programadores de la OMI siempre deben aplicar los más altos niveles de ética e integridad a su trabajo. Los hackers no son bienvenidos aquí.

La seguridad no tiene nada que ver con la palabra clave static (que es completamente irrelevante desde el punto de vista de la seguridad: una función puede declararse static y ser un agujero de seguridad, es decir, ser vulnerable. Una función segura puede ser global). Tiene mucho más que ver con evitar comportamientos indefinidos. Lea lo que todo programador de C debe saber sobre comportamiento indefinido y el estándar de codificación segura del lenguaje de programación CERT C.

Si por función segura, se refiere a una función que solo se puede llamar desde dentro de la clase, use private. Si quiere decir desde dentro de la clase o cualquier clase derivada de esa clase, use orotected.

Si está hablando de prevenir cosas como el desbordamiento del búfer, entonces hay otra respuesta que es bastante buena que no repetiré.

Estático simplemente significa que se puede invocar sin un puntero de clase y que no tiene acceso a miembros y funciones de clase no estáticos. Sí, a veces son útiles, pero esto es un poco raro.