va_list 不同架构下的初始化

va_list initialization in different architecture

  va_list args = 0;

我在我的应用程序中找到了上面的代码,并且它在以下 gcc 版本中编译正常。

~ $ /usr/sfw/bin/gcc -v
Reading specs from /usr/sfw/lib/gcc/sparc-sun-solaris2.10/3.4.3/specs
Configured with: /sfw10/builds/build/sfw10-patch/usr/src/cmd/gcc/gcc-3.4.3/configure --prefix=/usr/sfw --with-as=/usr/ccs/
bin/as --without-gnu-as --with-ld=/usr/ccs/bin/ld --without-gnu-ld --enable-languages=c,c++ --enable-shared
Thread model: posix
gcc version 3.4.3 (csl-sol210-3_4-branch+sol_rpath)

但是当我在新机器上编译相同的代码时,它出现了问题,因为 va_list args 初始化为零。希望 va_list 是某种类型的定义,我用零删除了 va_list 的初始化,它在新机器上编译得很好。

幸好新旧机器的gcc版本相同

    NEW MACHINE GCC VERSION:
    Reading specs from /usr/sfw/lib/gcc/i386-pc-solaris2.10/3.4.3/specs
Configured with: /builds/sfw10-gate/usr/src/cmd/gcc/gcc-3.4.3/configure --prefix=/usr/sfw --with-as=/usr/sfw/bin/gas --with-gnu-as --with-ld=/usr/ccs/bin/ld --without-gnu-ld --enable-languages=c,c++ --enable-shared
Thread model: posix
gcc version 3.4.3 (csl-sol210-3_4-branch+sol_rpath)

但我注意到两台机器的架构不同。这会导致任何问题吗?

因为 stdarg 是一个标准库。那么为什么它会因架构而异?

va_list 不应该被初始化。在调用 va_start() 之前,它只是保持未初始化状态,这是 C 和 C++ 中的标准。

您的旧密码已损坏。无论您使用的是哪个平台,只需删除 =0,然后重试。

Since stdarg is an standard library. So why it is varying based on architecture?

是的,它是标准的,但它只能用于官方支持的方式,使用 0 的初始化不是这些方式之一。

va_list 在这方面并不特殊,有很多类型和函数是标准的,但在处理无效使用方面有实现差异。一个简单的例子是 printf(0);,它可能在某些实现上默默地工作并且什么都不做,但在其他实现上在运行时严重崩溃。

不幸的是,对于碰巧在您的特定平台上被接受的无效程序,没有任何万无一失的检查程序,也不可能有。