2016-05-05 4 views
0
va_list args = 0; 

上記のように自分のアプリケーションにコードがあり、次のgccバージョンで正しくコンパイルされています。異なるアーキテクチャでのva_listの初期化

~ $ /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引数がゼロで初期化されているため、問題が発生しています。希望va_listは何かのtypedefであり、私はゼロで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) 

しかし、私は2つのマシンのアーキテクチャが異なることに気づいた。それは問題を引き起こしていますか?

stdargは標準ライブラリなので、なぜそれがアーキテクチャに基づいて変化しているのですか?

答えて

1

stdargは標準ライブラリなので、なぜそれがアーキテクチャに基づいて変化しているのですか?

はい、標準ですが、公式にサポートされている方法でのみ使用でき、0を使用した初期化はそのいずれでもありません。

va_listは、その点で特別なものではないが、標準であるが、無効な使用の処理に実装のバリエーションがあるたくさんの種類と機能がある。簡単な例はprintf(0);であり、いくつかの実装では何もしなくても動作しますが、実行時には他の実装ではひどくクラッシュします。

あなたの特定のプラットフォームで受け入れられる無効なプログラムのための残念なことに、不正プログラムチェッカーはありません。

+0

gccはどちらのアーキテクチャでも実装されているので、両方のマシンで同じ実装を行います。 gccの実装がマシンごとに異なるかどうかは疑問です。これは初めてです。 –

+1

@VinothKumar引数の受け渡し規則はアーキテクチャによって異なりますが、他のものより複雑なものもあります.gccはアーキテクチャ設計者が設定したルールに従う必要があります。 SPARCでは、それは複雑で、 'va_list'は構造体です。構造体に '0'のようなスカラーを代入することはできません。おそらく、標準委員会は、すべての変数の初期化を要求するプログラミング標準を満たすために、 'va_list_null'値のようなものを提供するよう求められるかもしれません。 –

2

は決して初期化しないでください。 va_start()が呼び出されるまで、初期化されていないのはCとC++の標準です。

古いコードが壊れています。現在使用しているプラ​​ットフォームに関係なく=0を削除して、もう一度お試しください。

関連する問題