🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

8 total messages Started by Maciek Tue, 02 Jan 2018 20:52
Błąd kompilacji: Control reaches end of non-void function
#309566
Author: Maciek
Date: Tue, 02 Jan 2018 20:52
14 lines
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
#309568
Author: godek.maciek
Date: Tue, 02 Jan 2018 20:57
17 lines
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
#309576
Author: Maciek
Date: Tue, 02 Jan 2018 21:44
9 lines
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
#309571
Author: Wojciech Muła
Date: Tue, 02 Jan 2018 22:20
33 lines
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
#309562
Author: m.labanowicz
Date: Wed, 03 Jan 2018 09:05
25 lines
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
#309579
Author: Wojciech Muła
Date: Wed, 03 Jan 2018 12:21
31 lines
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
#309580
Author: m.labanowicz
Date: Wed, 03 Jan 2018 14:11
33 lines
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
#309572
Author: AK
Date: Wed, 03 Jan 2018 15:09
16 lines
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