声明一个没有参数的函数原型会造成安全漏洞吗?

Can declaring a function prototype without parameters create security breaches?

我听说调用 int main(){...} 是一种不好的做法,应该用它的参数 int main(int argc, char* argv[]){...} 调用函数,我想知道这是否可以 泛化为函数声明在 headers.

在某些情况下,可能必须在 header 中编写一个 函数原型,而在输入 上不带任何参数(例如,由于某些包含问题的原因),并且 在远程 .c 文件中的函数定义 中声明输入参数及其类型。这是否可能导致安全问题,因为人们可以利用这种信息缺失?还是函数定义(声明了输入参数)阻止了这种情况?我找不到任何关于此的 link。

在 C 中声明函数原型时没有任何列出的参数,如

voif my_function();  // No specified arguments

编译器将其视为声明一个函数,其中包含未知数量的未知类型参数。

这意味着调用者可以传递他们喜欢的任何参数,编译器会很乐意接受它,而无需检查是否正确(因为这是不可能的)。对于翻译单元的其余部分,将假定用于第一次调用的参数是函数采用的参数。

现在,如果另一个翻译单元使用不同的参数调用相同的函数,您就会突然出现不匹配的调用。如果即使一个调用与函数定义中的实际参数不匹配,那么您将有 未定义的行为


这当然不同于定义一个没有参数的函数:

void my_function()
{
    // Some code...
}

如果函数还没有另外声明,那么这也声明函数不带参数。这实际上等同于

void my_function(void)
{
    // Some code...
}

最后 the main function。不允许声明main函数的原型,只能定义(实现)它。

并且 int main(void) 是该函数的有效变体,这(因为不允许使用原型)意味着您可以使用 int main(),因为它等同于 int main(void)