Thread View: pl.comp.lang.c
8 messages
8 total messages
Started by Maciek
Tue, 02 Jan 2018 20:52
Błąd kompilacji: Control reaches end of non-void function
Author: Maciek
Date: Tue, 02 Jan 2018 20:52
Date: Tue, 02 Jan 2018 20:52
14 lines
1534 bytes
1534 bytes
Mam funkcję która zwraca wskaźnik stosu, jak mogę ją poprawić lub ominąć błąd kompilacji:
Control reaches end of non-void function
funkcja:
unsigned long sp(void) {
asm("movl %esp, %eax");
}
Dzięki za pomoc.
Pozdrawiam, M.
Re: Błąd kompilacji: Control reaches end of non-void function
Author: godek.maciek
Date: Tue, 02 Jan 2018 20:57
Date: Tue, 02 Jan 2018 20:57
17 lines
1871 bytes
1871 bytes
W dniu wtorek, 2 stycznia 2018 21:52:30 UTC+1 użytkownik Maciek napisał:
> Mam funkcję która zwraca wskaźnik stosu, jak mogę ją poprawić lub ominąć błąd kompilacji:
>
> Control reaches end of non-void function
>
> funkcja:
>
> unsigned long sp(void) {
> asm("movl %esp, %eax");
> }
>
>
> Dzięki za pomoc.
>
> Pozdrawiam, M.
https://stackoverflow.com/questions/2114163/reading-a-register-value-into-a-c-variable
Re: Błąd kompilacji: Control reaches end of non-void function
Author: Maciek
Date: Tue, 02 Jan 2018 21:44
Date: Tue, 02 Jan 2018 21:44
9 lines
1821 bytes
1821 bytes
W dniu wtorek, 2 stycznia 2018 21:57:08 UTC+1 użytkownik godek....@gmail.com napisał: > https://stackoverflow.com/questions/2114163/reading-a-register-value-into-a-c-variable OK, tylko że clang++ nie ma przełącznika -ffixed-reg szukam w dokumentacji ale nie mogę znaleźć odpowiednika. Dzięki za tą stronę. Pozdrawiam, M.
Re: Błąd kompilacji: Control reaches end of non-void function
Author: Wojciech Muła
Date: Tue, 02 Jan 2018 22:20
Date: Tue, 02 Jan 2018 22:20
33 lines
2348 bytes
2348 bytes
On Tuesday, January 2, 2018 at 9:52:30 PM UTC+1, Maciek wrote:
> Mam funkcję która zwraca wskaźnik stosu, jak mogę ją poprawić lub ominąć błąd kompilacji:
>
> Control reaches end of non-void function
>
> funkcja:
>
> unsigned long sp(void) {
> asm("movl %esp, %eax");
> }
To jest niepoprawny program, bo zapisujesz do eax, a nie
mówisz kompilatorowi, że modyfikujesz ten rejestr.
Mniej więcej tak jest OK asm("mov %esp, %eax") : : : "eax"),
ale najlepiej unikać podawania rejestrów wprost.
Zrób jak człowiek:
unsigned long sp() {
unsigned long result;
asm("movl %%esp, %0" : "=r" (result));
return result;
}
Pod %0 kompilator wstawi co mu będzie pasowało, Ty jedynie
piszesz, że chcesz żeby Ci to "result"; gcc -O2 generuje
najkrótszy możliwy program:
movl esp, rax
ret
w.
Re: Błąd kompilacji: Control reaches end of non-void function
Author: m.labanowicz
Date: Wed, 03 Jan 2018 09:05
Date: Wed, 03 Jan 2018 09:05
25 lines
1858 bytes
1858 bytes
Witam,
moje 3 grosze w temacie:
> unsigned long sp(void) {
> asm("movl %esp, %eax");
> }
Moze latwiej byloby wykorzystac kod bez asm'a:
#include <stdio.h>
#include <stdlib.h>
void * sp(void) {
void * volatile result = (void *)(&result);
return result;
}
int main(void) {
printf("sp=%p\n", sp());
return EXIT_SUCCESS;
}
Pozdr.
--
Maciej Labanowicz
Re: Błąd kompilacji: Control reaches end of non-void function
Author: Wojciech Muła
Date: Wed, 03 Jan 2018 12:21
Date: Wed, 03 Jan 2018 12:21
31 lines
2130 bytes
2130 bytes
On Wednesday, January 3, 2018 at 10:05:43 AM UTC+1, m.laba...@gmail.com wrote:
> Witam,
>
> moje 3 grosze w temacie:
>
> > unsigned long sp(void) {
> > asm("movl %esp, %eax");
> > }
>
> Moze latwiej byloby wykorzystac kod bez asm'a:
>
> #include <stdio.h>
> #include <stdlib.h>
> void * sp(void) {
> void * volatile result = (void *)(&result);
> return result;
> }
> int main(void) {
> printf("sp=%p\n", sp());
> return EXIT_SUCCESS;
> }
Bardzo sprytne, ale trzeba dodać sizeof(result),
bo inaczej jest:
leaq -8(%rsp), %rax
movq %rax, -8(%rsp)
movq -8(%rsp), %rax
ret
w.
Re: Błąd kompilacji: Control reaches end of non-void function
Author: m.labanowicz
Date: Wed, 03 Jan 2018 14:11
Date: Wed, 03 Jan 2018 14:11
33 lines
2263 bytes
2263 bytes
> Bardzo sprytne, ale trzeba dodać sizeof(result),
To zalezy czy stack rosnie czy maleje.
Mala modyfikacja.
Bardzo mozliwe, ze ta detekcja zostanie 'zepsuta' przez optymalizator.
--------------------------------------
#include <stdio.h>
#include <stdlib.h>
int sp_direction_internal(int * a_ptr)
{
int b = 0;
return (&b < a_ptr) ? -1 : 1;
}
int sp_direction(void)
{
int a = 0;
return sp_direction_internal(&a);
}
void * sp(void) {
int * volatile result = (int *)(&result) - (sp_direction() < 0);
return result;
}
int main(void) {
printf("sp_direction=%d\n", sp_direction());
printf("sp=%p\n", sp());
return EXIT_SUCCESS;
}
--------------------------------------
--
Maciej Labanowicz
Re: Błąd kompilacji: Control reaches end of non-void function
Author: AK
Date: Wed, 03 Jan 2018 15:09
Date: Wed, 03 Jan 2018 15:09
16 lines
1534 bytes
1534 bytes
Użytkownik "Maciek" <moblaza@gmail.com> napisał:
> Mam funkcję która zwraca wskaźnik stosu, jak mogę ją poprawić lub ominąć błąd kompilacji:
> Control reaches end of non-void function
> funkcja:
>
>unsigned long sp(void) {
> asm("movl %esp, %eax");
>}
Podstaw %esp pod C-owa zmiena (moze byc z modyfikatorem register) i zwroc zmienna.
PS: tylko asm("movl %esp, %eax"); jest bledne. Skad wiesz ze kompoilator zwraca poprzez ax/eax?
To tylko konwencja kompilatora (fakt ze powszechna w swiecie x86) ale nie 'mus' w sensie C.
AK
Thread Navigation
This is a paginated view of messages in the thread with full content displayed inline.
Messages are displayed in chronological order, with the original post highlighted in green.
Use pagination controls to navigate through all messages in large threads.
Back to All Threads