printf(“oi lindinhos!\n”);
há mil dias li um post do *xorl* intitulado de "Funny C programming interview questions", achei uma certa piada ao raio do post e resolvi escrever aqui sobre isso.
no post o xorl apresenta a solução para uma das questões colocadas neste *site*, no qual nos é questionado se é possível fazer com que a variável "i" apresente outro valor, senão "2", apenas adicionando código à função foo().
#include <stdio.h> #include <stdlib.h> void foo(void); int main (void) { int i=2; foo(); printf ("%d\n",i); return EXIT_SUCCESS; } void foo(void) { // add code so that printf above prints different value of i (i.e. not 2) }
a primeira coisa que me ocorreu (em mil milésimos de segundo) foi modificar directamente o valor de "i" através da função "printf" e então fiz o seguinte :
#include <stdio.h> #include <stdlib.h> void foo(void); int main(void) { int i = 2; foo(); printf("%d\n", i); return EXIT_SUCCESS; } void foo(void) { unsigned long addr; __asm("movl %%ebp, %0" : : "m"(addr)); printf("%1$n", addr += 24); }
o que fiz aqui foi calcular o endereço da variável "i" apartir do base pointer (EBP) e fazer com que a funçao printf escrevesse 0 bytes no endereço da mesma através do especificador de formato "%n".
bash-3.1# gcc -o printf printf.c bash-3.1# ./printf 0 bash-3.1#
ainda assim existe outra solução óbvia da qual me lembrei também, que consiste em fechar o file descriptor utilizado pela função printf ( stdout ) depois da função foo().
void foo(void) { fprintf(stderr, "%d\n", 0); close(1); }
queria dedicar este post inútil ao cavalo que morreu hoje atropelado no brasil.