mirror of
https://gitlab.com/blau_araujo/cblc.git
synced 2025-06-07 12:06:37 -03:00
Alvaro: Dúvida sobre pilha. #14
Loading…
Add table
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Blau, eu estava assistindo o vídeo da aula 4 e resolvi fazer um programa semelhante ao seu.
Como o seu programa não funcionava como esperado na minha máquina, eu fiz algumas modificações no código.
A execução do código ficou assim:
Para a minha surpresa, na execução do meu programa a variável
a
ficou alocada 4 bytes abaixo da variávelb
ao invés de 4 bytes acima.Daí passou duas coisas pela minha cabeça:
Se a segunda hipótese for válida, a aritmética de ponteiros pode comprometer a portabilidade do programa.
É isso mesmo?
@alvaro wrote in #14 (comment):
Se você compilou no Windows, a pilha deles cresce para cima, ao contrário do que acontece em sistemas Unix-like, como o GNU/Linux. Neste caso, sim, a aritmética tem que ser invertida se você estiver lidando com endereços genéricos na pilha. Mas, como veremos na aula de hoje (aula 6), a aritmética não muda com dados em estruturas contínuas, como vetores.
Eu compilei no Ubuntu.
@alvaro wrote in #14 (comment):
No Ubuntu mesmo ou no Ubuntu do WSL?
Ubuntu 24.04.2 LTS
@alvaro wrote in #14 (comment):
Acho melhor você passar mais detalhes a cada mensagem, evitando conversar como se fosse um chat. Por exemplo, como você compilou, qual é a sua versão do compilador e qual é a arquitetura do seu sistema?
As especificações da linguagem C não determinam a ordem em que as variáveis são incluídas no quadro de pilha da função. O gcc, no Linux x86_64, inclui na ordem em que elas são escritas no código, resultando em endereços mais baixos porque é a direção de crescimento da pilha em sistemas Unix-like. Mas este não é um comportamento universalmente garantido.
Obrigado, Blau.
Eu testei o seu código no meu sistema (copiado e colado daqui) e tive os resultados esperados originalmente:
@alvaro , eu fui verificar o que pode estar acontecendo e notei que esse resultado específico pode estar relacionado com o gcc. Veja, meu código compilado no Debian com o gcc 14.2 resulta nesse trecho de assembly:
Isso foi obtido com:
Que gera o arquivo em Assembly
var4.s
.Se você experimentar e encontrar uma inversão nessas linhas, é possível que o gcc do Ubuntu seja compilado com uma flag recente que nem existe na minha versão no Debian:
fstack-var-order
.Você pode conferir se ela está definida com:
Pode ser que ela não apareça, mas se aparecer explica também por que essa inversão acontece no Ubuntu do WSL, como relatado pelo colega Augusto na turma anterior.