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.