我听说打电话int main(){...}
是一种不好的做法,应该使用其参数来调用该函数 int main(int argc, char* argv[]){...}
,我想知道这是否可以推广到 header 中的函数声明。
在某些情况下,可能必须在 header 中编写一个函数原型(prototype),而输入上没有任何参数(例如,出于某些原因,例如包含问题),并声明输入参数和它们的类型位于远程 .c 文件的函数定义中。这是否可能会导致安全问题,因为人们可以利用这种信息的缺失?或者函数定义(声明了输入参数)是否阻止了这种情况?我找不到任何关于此的链接。
最佳答案
在 C 中,当声明没有任何列出的参数的函数原型(prototype)时,如
voif my_function(); // No specified arguments
编译器将其视为声明具有未知数量的未知类型参数的函数。
这意味着调用者可以传递他们喜欢的任何参数,编译器会很乐意接受它,而无需检查正确性或不正确性(因为这是不可能的)。对于翻译单元的其余部分,第一次调用使用的参数将被假定为函数采用的参数。
现在,如果另一个翻译单元使用不同的参数调用同一函数,您会突然出现不匹配的调用。如果甚至一次调用与函数定义中的实际参数不匹配,那么您将出现未定义的行为。
<小时/>这当然与定义不带参数的函数不同:
void my_function()
{
// Some code...
}
如果该函数尚未以其他方式声明,那么这也会将该函数声明为不带参数。这实际上相当于
void my_function(void)
{
// Some code...
}
<小时/>
最后是the main
function 。不允许声明 main
函数的原型(prototype),只能定义(实现)它。
并且 int main(void)
是该函数的有效变体,这(因为不允许使用原型(prototype))意味着您可以使用 int main()
因为它相当于 int main(void)
。
关于声明不带参数的函数原型(prototype)会造成安全漏洞吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59729556/