elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Recopilación Tutoriales y Manuales Hacking, Seguridad, Privacidad, Hardware, etc


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  funciones anidadas en C
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: funciones anidadas en C  (Leído 3,299 veces)
4v1dy4

Desconectado Desconectado

Mensajes: 137



Ver Perfil
funciones anidadas en C
« en: 23 Enero 2023, 17:16 pm »

Hola,

¿Existe alguna forma en la que pueda anidar funciones en el lenguaje C?

Tengo entendido que no... Pero si alguien conoce al menos algo que tenga el mismo resultado que:

Código
  1. int foo()
  2. {
  3.    // ...
  4.    int subf()
  5.    {
  6.        return 0;
  7.    }
  8.    // ...
  9.    subf();
  10.    // ...
  11. }

lo agradeceria. Un saludo


En línea

BloodSharp


Desconectado Desconectado

Mensajes: 804


El Messi-Vegeta :D


Ver Perfil
Re: funciones anidadas en C
« Respuesta #1 en: 23 Enero 2023, 19:07 pm »

¿Existe alguna forma en la que pueda anidar funciones en el lenguaje C?

En C puro no tengo idea, pero sé que en el estandar de C++11 se agregó la posibilidad de utilizar funciones lambda.

https://learn.microsoft.com/en-us/cpp/cpp/lambda-expressions-in-cpp


B#


En línea



RayR

Desconectado Desconectado

Mensajes: 239


Ver Perfil
Re: funciones anidadas en C
« Respuesta #2 en: 23 Enero 2023, 20:20 pm »

GCC sí permite funciones anidadas, pero es una extensión al lenguaje específica de ese compilador y, llegados a ese punto, ya no estarías realmente programando en C sino en el dialecto GNU C.

Para algo en C estándar necesitas especificar qué es exactamente lo que esperas y por qué no usar una función normal. En la mayoría de los casos, este tipo de cosas son innecesarias y casi siempre hay mejores maneras de hacerlas. Sin más contexto, te diría que las formas obvias serían goto o setjmp/longjmp, pero está totalmente desaconsejado su uso, y tienen inconvenientes que casi siempre superan con mucho las posibles ventajas. Pero si explicas mejor lo que buscas, puede que haya alternativas mejores.
En línea

4v1dy4

Desconectado Desconectado

Mensajes: 137



Ver Perfil
Re: funciones anidadas en C
« Respuesta #3 en: 23 Enero 2023, 22:07 pm »

BloodSharp gracias por la sugerencia pero si, tendria que ser en C puro. De igual forma no podria ser una funcion lambda. Tendria que ser una funcion anidada "practicamente" a bajo nivel.

Es decir, que

Código
  1. int foo()
  2. {
  3.    // ...
  4.    int subf()
  5.    {
  6.        return 0;
  7.    }
  8.    // ...
  9.    subf();
  10.    // ...
  11. }

se compile a

Código
  1. foo:
  2. ; ...
  3. subf:
  4. mov rax, 0
  5. ret
  6. ; ...
  7. call subf
  8. ; ...
  9. ret

RayR realmente era una forma de hacer lo que pretendia hacer. Ya halle otra manera, al final no me fue necesario usar funciones anidadas.

Mi problema vino con problematicas al generar codigo PIC con GCC justamente. da problemas cuando utilizas punteros a funciones e iba a intentar implementar la funcion como anidada a ver si asi el compilador cargaba el desplazamiento.

Por alguna razon, al hacer:

Código
  1. int (*__ptr__foo)();
  2. __ptr__foo = &foo;

al intentar hacer cosas con __ptr__foo me di cuenta que el compilador simplemente omite las lineas que lo incluyen. Es decir, si hago algo como:

Código
  1. int (*__ptr__foo)();
  2. __ptr__foo = &foo;
  3. mostrar(__ptr__foo);
(mostrar seria una funcion hipotetica. Para poner mejor en contexto cabe mencionar que no estoy enlazando ninguna libreria estandar o no estandar)

lo que me muestra es:

Citar
... $ ./main
0

es decir, o no lo incluye, o cuando se le requiere lo "optimiza" como 0.

la verdad no se por que ocurre.

lo que hice para solucionarlo fue un poco sucio. Cree una funcion llamada get_ptr:

Código
  1. void *get_ptr()
  2. {
  3.    return __ptr__foo;
  4. }

que se compila a:

Código
  1. get_ptr:
  2. mov rax, 0
  3. ret
(porque como digo, siempre interpreta punteros a funciones (locales, ojo, es decir, dentro del scope. Porque luego puedo apuntar a alguna API o syscall y la ejecuta con exito)

y lo que hice fue un programa que carga el .asm en memoria y reemplaza

Código
  1. get_ptr:
  2. mov rax, 0
  3. ret

por

Código
  1. get_ptr:
  2. mov rax, foo
  3. ret

ya se, una solucion medio barata pero no se me ocurre otra cosa

Comento el contexto por si a alguien le interesara aconsejar alguna practica mas eficiente/limpia o cualquier otro bonito adjetivo xd
En línea

RayR

Desconectado Desconectado

Mensajes: 239


Ver Perfil
Re: funciones anidadas en C
« Respuesta #4 en: 24 Enero 2023, 02:58 am »

Si se trata de optimizaciones del compilador, es difícil saber qué está pasando sin ver el código exacto, porque son muy específicas para cada caso.

En general, optimizaciones así de agresivas sólo son permitidas si: 1) estás haciendo algo indebido o que resulte en UB (por ejemplo, usar punteros no inicializados), ó 2) el compilador determina que el comportamiento "observable" del programa no se ve alterado. Por ejemplo, si llamas a una función y luego no haces nada "útil" con el resultado (como imprimirlo, guardarlo en un archivo, mandarlo por un socket, pasarlo a una función externa, etc.), el compilador es libre de omitir por completo la llamada si determina que la función tampoco hace nada que tenga un efecto observable.

Algo de lo anterior debe ser la causa. De lo contrario, y a menos que esté pasando por alto algo, no hay razón para que GCC te altere el código de esa forma.

¿Qué opciones activas en GCC? Si usas -O, -O2, etc., prueba a quitarla y ve el código generado. Otra cosa a probar, con fines de diagnóstico y para corroborar que GCC no sea el problema, es que la función que hace algo con el puntero esté definida en un archivo fuente (ojo, fuente, no de cabecera, pues la idea es que se compilen por separado) distinto a aquél en el que la invocas y declaras el puntero a pasarle. Sólo asegúrate de que la función use el puntero recibido para algo que tenga un efecto externo (puede ser algo tan simple como retornarlo tal cual). Si aún así hace lo mismo, puede haber algo mal en tu código, por lo que podrías probar a compilar, por ejemplo, con -Wall -Wextra, y tal vez incluso -Wpedantic. Técnicamente, la conversión entre punteros a funciones y punteros a objetos (los punteros "normales"), incluyendo void*, no es válida, y probablemente se te muestre un warning, pero dudo que eso cause el problema, porque esas conversiones son tan comunes que los compiladores normalmente las admiten y generan código correcto.
En línea

4v1dy4

Desconectado Desconectado

Mensajes: 137



Ver Perfil
Re: funciones anidadas en C
« Respuesta #5 en: 25 Enero 2023, 17:28 pm »

RayR si, utilizaba la opcion -O. La quite y seguia generando el mismo codigo (solo que sin optimizar).

Me parece curiosisimo que GCC se atreva a resolver una direccion como 0, aunque igual estoy haciendo algo mal yo (seguramente) y eso lo hace como medida de seguridad para que mas bien falle antes de tener un comportamiento no deseado.

El codigo es tal cual como mostre... lo que mas bien creo que genera el problema es que estoy generando codigo "independiente". Por un momento pense en ver si era LD lo que estaba resolviendo las direcciones a 0, pero luego compile el codigo a ASM y lo que vi fue precisamente eso... resoluciones a 0 u omisiones por completo del codigo en cuestion.

En fin... al final me fui por otra manera de hacer lo mismo. En terminos de costo/beneficio no me costaba nada hallar otra forma de hacer lo mismo. No se si eso es muy o muy poco hacker de mi parte XD De igual forma gracias por su ayuda.
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
listas desplegables anidadas
PHP
m0m0 4 6,121 Último mensaje 19 Mayo 2009, 15:18 pm
por cassiani
Estructuras anidadas, funciones y punteros
Programación C/C++
NathanD 9 10,388 Último mensaje 18 Marzo 2013, 08:56 am
por 85
[AYUDA] Listas anidadas?
Programación C/C++
carlosabcs18 4 4,684 Último mensaje 5 Noviembre 2014, 03:27 am
por carlosabcs18
¿Funciones anidadas?
ASM
GGZ 5 3,852 Último mensaje 25 Noviembre 2016, 16:39 pm
por xv0
Estructuras Anidadas en C
Programación C/C++
Ghio97 5 2,409 Último mensaje 4 Septiembre 2019, 10:22 am
por MAFUS
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines