Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 未指定的返回值_C_Return_Return Value - Fatal编程技术网

C 未指定的返回值

C 未指定的返回值,c,return,return-value,C,Return,Return Value,关于返回值: func() { while(1) { /* do stuff here */ if(error1) exit(0); if(error2) break; } /* no return statement anywhere in func() */ } 但是调用方检查func()的返回代码 最好有人确认func()的返回值没有默认值,是垃圾。所有这些都是如此: void func() int func(),它根本没有retu

关于返回值:

func()
{
  while(1)
  {
    /* do stuff here */
    if(error1) exit(0);
    if(error2) break;
  }       
  /* no return statement anywhere in func() */
}
但是调用方检查func()的返回代码

最好有人确认
func()
的返回值没有默认值,是垃圾。所有这些都是如此:

  • void func()
  • int func()
    ,它根本没有return语句,或者带有普通的
    return
  • func()
    ,未指定的返回类型,据我所知默认为返回int

感谢..

函数的返回值通常由处理器的第一个寄存器返回,例如,基于x86的处理器返回EAX,基于ARM的处理器返回r0。它是特定于编译器的,但这或多或少是标准的

e、 g.
返回10将被转换为

mov eax 10 ; pseudo code
ret        ; pseudo code
用于基于x86的处理器的汇编中

&在检查返回值时,它只会检查eax寄存器。调用方将该寄存器中包含的任何内容视为返回值

所以。。。如果返回时没有值(简单的
return;
),或者它是一个void函数,那么调用程序将把EAX中在程序集中
ret
语句之前包含的任何值作为返回值

对于基于ARM的处理器,将上面答案中的EAX替换为r0。:-)

我使用这个事实作为对下面函数的攻击;-)


要在从C到ASM的转换过程中检查其工作方式,请编写以下简单代码:

int testfn(int unused){
   int unused2=unused; // Check how input is passed
   return 10;          // Check how output is returned
}
&然后用
gcc-S
编译它。(或者使用带有某个标志的编译器,该标志将只生成程序集。)



我不确定它如何返回float/struct值。可能它返回一个指向struct的指针&在转换为asm时,返回的整个struct都是memcpy'ed。有人可能会纠正:-)

函数的返回值通常由处理器的第一个寄存器返回,例如,基于x86的处理器返回EAX,而基于ARM的处理器返回r0。它是特定于编译器的,但这或多或少是标准的

e、 g.
返回10将被转换为

mov eax 10 ; pseudo code
ret        ; pseudo code
用于基于x86的处理器的汇编中

&在检查返回值时,它只会检查eax寄存器。调用方将该寄存器中包含的任何内容视为返回值

所以。。。如果返回时没有值(简单的
return;
),或者它是一个void函数,那么调用程序将把EAX中在程序集中
ret
语句之前包含的任何值作为返回值

对于基于ARM的处理器,将上面答案中的EAX替换为r0。:-)

我使用这个事实作为对下面函数的攻击;-)


要在从C到ASM的转换过程中检查其工作方式,请编写以下简单代码:

int testfn(int unused){
   int unused2=unused; // Check how input is passed
   return 10;          // Check how output is returned
}
&然后用
gcc-S
编译它。(或者使用带有某个标志的编译器,该标志将只生成程序集。)



我不确定它如何返回float/struct值。可能它返回一个指向struct的指针&在转换为asm时,返回的整个struct都是memcpy'ed。有人可能会纠正:-)

注意:此答案适用于C89(和早期版本)

void func()
指定不返回值的函数。在这种情况下,
if(func())
应导致编译错误

int func()
func()
是等价的,返回一个整数值。 如果return语句未提供任何值,则结果未定义,如果警告级别足够高,编译器将发出警告。
实际上,大多数编译器将生成返回寄存器或内存位置中用于返回值的任何内容的代码。

注意:此答案适用于C89(和早期版本)

void func()
指定不返回值的函数。在这种情况下,
if(func())
应导致编译错误

int func()
func()
是等价的,返回一个整数值。 如果return语句未提供任何值,则结果未定义,如果警告级别足够高,编译器将发出警告。
实际上,大多数编译器将生成返回寄存器或内存位置中用于返回值的任何内容的代码。

由于C99标准,您在C代码中发布的代码无效


如果您使用的是一个实现C90标准的过时编译器,那么它将进行编译,默认类型将为int。我相信从这样一个函数中省略return语句将导致未定义的行为,尽管我不能引用C90标准。

您发布的代码不是有效的C代码,因为C99标准


如果您使用的是一个实现C90标准的过时编译器,它将进行编译,默认类型将为int。我认为从这样的函数中省略return语句将导致未定义的行为,尽管我不能引用C90标准。

还需要注意的是,在C中定义或声明一个没有列出参数的函数意味着这些参数也是未指定的。如果函数不带参数,则必须使用
void
参数显式定义/声明它。谢谢@JoachimPileborg,我实际上在那里发布了一些东西来说明我的观点,但谢谢。另外请注意,在C中定义或声明一个没有列出参数的函数意味着参数也未指定。如果函数不带参数,则必须使用
void
参数显式定义/声明它。谢谢@JoachimPileborg,我实际上在那里发布了一些东西来说明我的观点,但谢谢。您只是描述了许多可能的未定义行为之一。在这种情况下,这并不重要,因为发布的代码不是有效的C。这个答案与常见的编译器(如gcc/visual studio等)是一致的。但是,它可能是dif