va_list是否有漏洞?

时间:2016-09-19 09:57:21

标签: c variadic-functions

#include <stdio.h>
#include <stdarg.h>

int sumfinder(int num, ...);

int main(void)
{

    int res,i,a,b,c;
    scanf( "%d %d %d",&a, &b, &c );
    res = sumfinder(a, b, c);// i also tried res=sumfinder(a,(int)b,(int)c); typecasting but to no avail
    printf( "results= %d", res );
    return 0;

}

int sumfinder( int maxsize, ... )
{
    va_list argp;
    int i;
    int sum = 0;
    va_start( argp, maxsize );
    for( i = 0 ; i < maxsize; i++ )
        sum += va_arg( argp, int );
    va_end(argp);
    return sum;
}

请输入输入2 3 4,输出= 7,正确因为3 + 4 = 7(2表示输入值的数量) 现在试试...... 2 3.0 4.0,你得到一个错误的输出,我试图进行类型转换,但没有任何纠正问题。 令人震惊的是,代码行总和+ = va_arg(argp,int)应该为输入2 3.0 4.0进行从float到int的转换,但是不会没有,它预计将被提供一个int,否则问题就会开始。 .. ONE MORE sos提示浮点数据类型不起作用它返回零输出,我使用的是windows10和gcc(...和codeblocks IDE)

IS va_arg()有问题或发生了什么?

2 个答案:

答案 0 :(得分:4)

您不检查函数scanf的返回值。此返回值计算成功写入的参数的数量。

如果输入值2 3.0 4.0,则scanf函数将返回2.将读取第一个和第二个参数,但第三个参数将保持未初始化状态。发生这种情况是因为您尝试读取整数但传递浮点(3.0是浮点数)。读取int由说明符%d

表示
scanf( "%d %d %d",&a, &b, &c );

然后使用未初始化的变量并将其传递给函数sumfinder,从而导致未定义的行为。

解决方案是始终检查函数的返回值,并确保在有效路径上执行。

答案 1 :(得分:1)

你做出了错误的假设:

  

代码行总和+ = va_arg(argp,int)应该对输入2 3.0 4.0进行从float到int的转换。

在您的函数中,您没有任何浮点值。在main中,无论你为scanf键入什么,你的参数都是int类型。它们不会因为你输入.0而变成花车。除非您在定义中更改类型,否则更改scanf中的格式不会产生任何影响。