本ページは公開が終了した情報の複製であり、掲載時点での情報です。本ページに記載されている内容について各所に問い合わせることはご遠慮下さい。
サポート技術情報

[QC]long型の演算時ポインタチェックが不正なコードを生成する

文書番号: 402136

最終更新日: 1998/03/23


この資料は以下の製品について記述したものです。


この記事は、以前は次の ID で公開されていました: JP402136

概要

この資料は、long 型の変数を扱う演算におけるコンパイラによる不正なコード生成に ついて説明したものです。

詳細

long 型の変数を扱う減算および加算において、ポインタチェックの指定があると不正 なコードが生成され、演算が正しく行われないことがあります。
以下のどちらかの条件セットを満たしたときに発生します。
(減算時について書かれていますが、加算時も同じです。)

条件セット1

a. 減数が、long 型の配列要素である。
b. 配列が、ローカル変数である。
c. 減数の添え字が、定数でない。
d. 減算結果が、負になる。
e. コンパイラオプションでポインタチェックを指定。

条件セット2

a. 減数が、ポインタ変数である(グローバル、ローカル共)。
b. 減算結果が、負になる。
c. コンパイラオプションでポインタチェックを指定。

再現プログラム

  #include <stdio.h>
  #include <malloc.h>
  long  *p;
  void main( void )
  {
      int   SubtrahendIndex = 0;
      long  array[1], diff;
      /* 条件セット1 */
      array[0] = 10L;
      diff = 5L - array[ SubtrahendIndex ];
      printf( "diff=%ld\n", diff );
      /* 条件セット2 */
      p = (long int *)malloc( sizeof( long int ) );
      *p = 10L;
      diff = 5L - *p;
      printf( "diff=%ld\n", diff );
  }

原因

ポインタチェックの指定により付加されるコードにより、キャリーフラグがクリア
されます。このため、その後に続く SBB や ADC などのキャリーフラグを伴う演算
が正しく行われません。

対処方法

 以下のいずれかの方法で回避できます。
  1. 配列はグローバル変数で宣言する。
  2. ポインタや配列による間接的な参照をしない。
  3. ポインタチェックを無効にする。
    • 統合環境では、以下の手順です。 <O/環境> -> <M/コンパイル・リンク...> -> <C/コンパイラオプション> デバッグオプションの <P/ポインタチェック> チェックボックスをつけない。
    • QCL コマンドでは、/Zr オプションをつけない。

詳細

  • QuickC は、米国 Microsoft Corporation の登録商標です。

Keywords: KBBUG KB402136
Technology: kbAudDeveloper kbCCompSearch kbQC200 kbZNotKeyword3

inserted by FC2 system