A função de 64 bits retorna o ponteiro de 32 bits
Essa função está enterrada em um ninho complexo; portanto, encontrar a causa provavelmente está além de qualquer coisa que eu possa perguntar, mas estou me perguntando se alguém poderá dar algumas dicas sobre como eu posso depurar isso. Aqui está a essência do código com o qual estou tendo problemas
//func1.c
somestruct* func1(somestruct* mystruct)
{
printf("func1: %p, %i\n", mystruct, mystruct->foo);
return mystruct;
}
//func2.c
somestruct* func1(somestruct* mystruct);
void func2()
{
somestruct *mystruct = malloc(sizeof(somestruct));
mystruct->foo = 10;
printf("func2: %p, %i\n", mystruct, mystruct->foo);
mystruct = func1(mystruct);
printf("back in func2: %p\n", mystruct);
free(mystruct);
}
E eu chamo func2. A saída é assim
func2: 0x7f38a00008c0, 10
func1: 0x7f38a00008c0, 10
back in func2: 0xffffffffa00008c0
(SEGFAULT trying to free 0xffffffffa00008c0)
O código real é mais complexo, "mystruct" é distribuído em muitos outros lugares também sem problemas, o fato de as funções estarem em arquivos diferentes parece que isso pode fazer parte do problema; sim, ele precisa retornar o ponteiro (o não é garantido que o ponteiro retornado seja o mesmo que o ponteiro de entrada). Parece-me realmente estranho que seja meio truncado (mas não realmente) para 32 bits e depois preenchido com ffffffff no topo.
Quando compilado em uma máquina de 32 bits, funciona exatamente como deveria.
Eu tinha considerado corrupção de memória em algum lugar, então eu a executei através do valgrind. O Valgrind não reporta erros e, na verdade, faz com que seja concluído com êxito. Textbook heisenbug. Pelo menos eu posso usar o GDB.
Alguém tem alguma idéia do que pode estar causando isso, ou pelo menos como eu posso começar a rastrear o problema?