Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

libmin_sbrk'in 8 byte hizalı olmayan pointer döndürmesi #11

Open
farukyld opened this issue Sep 25, 2024 · 2 comments
Open

libmin_sbrk'in 8 byte hizalı olmayan pointer döndürmesi #11

farukyld opened this issue Sep 25, 2024 · 2 comments
Labels
bug Something isn't working karar verilecek üzerine konuşulup karar verilecek

Comments

@farukyld
Copy link
Owner

iki mümkün çözüm var:

1 - hizasız olarak hesaplanan pointer'ı hizalayarak, her sbrk çağrısında n < 8 byte alanı israf etmek.
2 - daha zorlama bir çözüm olmakla birlikte: hizasız döndürülen pointer'ı malloc ve free içinde göz önünde bulundurarak gösterdiği alana parçalı load/store yapmak.

@farukyld farukyld added bug Something isn't working karar verilecek üzerine konuşulup karar verilecek labels Sep 25, 2024
@omerguzelelectronicguy
Copy link
Collaborator

normalde nasıl yapılıyor?
bu arada bizde hizasız durumda exception veriyor ama bu işine yarar mı?

@farukyld
Copy link
Owner Author

farukyld commented Oct 2, 2024

normalde nasıl yapılıyor?

normalde sbrk ile ilgili bir hizalama kısıtı yok. ama malloc 8 byte hizalı döndürüyor.

#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>

int main() {
        void *p;
        p = malloc(1);
        printf("1 byte mallocd: %p\n",p);
        p = malloc(1);
        printf("1 more byte mallocd: %p\n",p);
        int* q = (int*)(((char*)p)+1);
        printf("p + 1 casted to int pointer: %p\n",q);
        int a = 1;
        *q=a;
        p = sbrk(0);
        printf("Initial brk: %p\n", p);
        p = sbrk(1); // Increase the brk (returns OLD brk!)
        p = sbrk(0); // Get the new brk
        printf("New brk: %p\n", p);


        return 0;
}

koduyla denedğimide çıktısı:

> gcc main.c ; ./a.out
1 byte mallocd: 0x556830a732a0
1 more byte mallocd: 0x556830a736d0
p + 1 casted to int pointer: 0x556830a736d1
Initial brk: 0x556830a94000
New brk: 0x556830a94001

Hizasız bir poniter'ı int poniter'ına cast edince hizalama yapıyor mu diye de baktım. yapmıyormuş.

14b7dc6'te sbrk 8 byte hizalı döndürecek diye değiştirmiştim. geçici bir çözüm sağlayacak, belki daha sonra hizalama görevini malloc'a alırım, standard kütüphane'de (malloc ve sbrk'in gerçeklendiği libc) olduğu gibi.

bu arada bizde hizasız durumda exception veriyor ama bu işine yarar mı?

bence evet. çünkü kodun temiz olduğundan emin olmamızı sağlar. hem spike'ta da yanlış hatırlamıyorsam hata veriyordu

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
bug Something isn't working karar verilecek üzerine konuşulup karar verilecek
Projects
None yet
Development

No branches or pull requests

2 participants