- ベストアンサー
AIXの環境でコンパイルしたプログラムのコンパイラーバージョンによる挙動の違い
- AIX(5.3)の環境でプログラムソースをコンパイルし実行したところ、コンパイラーのバージョンの違いによる、挙動の違いを発見しました。
- コンパイラーの不具合なのか、コンパイラーバージョンによる挙動の違いなのか確認したいです。
- コンパイラーのバージョンは、vacpp 6.0とvacpp 9.0です。サンプルソースコードと実行結果を参考にしてください。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
> 変数cについても実行結果が違うのですが、この結果もありうると言うことでしょうか? あり得るんじゃないでしょうか。 どうしてそうなるのかをちゃんと説明するには、コンパイラが生成したバイナリを逆アセンブルしてみる必要があるでしょう。 va_start( arglist, a );~va_end( arglist );とva_start( arglist, b );~va_end( arglist );のコードを消して、cだけを対象にva_start()を使った場合にも結果が異なるようならコンパイラの不具合を疑うところですが。 ちなみに、GCCでコンパイルしたところちゃんとva_start()について警告が出て、下記のような結果になりました。 warning: second parameter of 'va_start' not last named argument 1.a=bffff688 2.b=bffff68c ---------------------- 3.bffff694=2fbc=C bffff698=2fbc=C bffff69c=2fc0=D ---------------------- 3.bffff694=2fbc=C bffff698=2fbc=C bffff69c=2fc0=D ---------------------- 3.bffff694=2fbc=C bffff698=2fbc=C bffff69c=2fc0=D
その他の回答 (2)
- Tacosan
- ベストアンサー率23% (3656/15482)
全然関係ないですけど, このコードって未定義動作の嵐のような気がする. とりあえず ・ポインタの値を %x で出力しようとしてる ・arglist を無理矢理 char ** にキャストしてる ・可変引数関数に対する実引数の型がおかしい (最後の 0) あたりは気付く.
- salsberry
- ベストアンサー率69% (495/711)
va_start()は、引数リストで...の直前の変数(サンプルコードの中ではc)にしか使えません。それ以外の変数を対象にした場合の動作は保証されていないはずです。 したがって、期待したとおりの挙動にならなくても文句は言えません。
補足
ご回答ありがとうございます 変数cについても実行結果が違うのですが、この結果もありうると言うことでしょうか? <バージョン6.00実行結果=正しい結果> ---------------------- 3.2ff22574=10002464=C 2ff22578=10002464=C 2ff2257c=10002466=D <バージョン9.00実行結果=正しくない結果> ---------------------- 3.2ff22a54=10000a34=C ←おかしい 2ff22a5c=10000a36=D
お礼
解決しました! コンパイラーのパッチが出ていたので、それをインストールするとこの現象がでなくなりました。 お騒がせしました。
補足
ご返答ありがとうございます その後、いろいろ試してみたのですがfor文をwhile文に変更してみた結果正常に動作しました。 for( ; (temp = va_arg( arglist, char * )) != 0; ){ ↓↓↓ while( (temp = va_arg( arglist, char * )) != 0 ){ またfor文のままでもC++とせずCでコンパイルしたところ正常に動作します。 C++でのfor文の使用方法に問題があるのでしょうか?