声明不带参数的函数原型(prototype)会造成安全漏洞吗?

标签 c security function-declaration function-definition

我听说打电话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/

相关文章:

angularjs - 如果电子邮件地址中包含 '+',则 Angular 向 Asp.net Web API 发送访问 token 将不起作用

security - 还记得我的 Cookie 最佳实践吗?

security - 我是否需要小心连接到哪些 Maven 存储库?

javascript - 分配给函数是否会覆盖该函数或创建隐式全局变量?

c++ - 带有字符串消息的函数声明

c - 从左到右移动字符数组

c - 嵌入式C测试开发管理

c - C 是否支持可选的空参数?

C 中的连续空格去除

c - 函数在另一个函数中带有指针参数?