LP64 migration warning

64ビットコンパイルした時に、データサイズの計算式に対してワーニングが出る。
原因は、ssize_t型が64ビット整数であり、32ビット整数と64ビット整数の間で演算を行うため。
回避策は、64ビット整数だけを使って計算式を記述するか、又は sizeof(型名[要素数]) を使う。
以下、サンプルソース

     1  #include <stdio.h>
     2
     3  /* レコード構造定義 */
     4  typedef struct _T1 {
     5      int  a[16];
     6      int  b[16];
     7      char c[16];
     8  } T1;
     9
    10  /* レコード数定義 */
    11  #define MAXREC  (100)
    12  #define MAXRECL (100L)
    13
    14  /* バッファ変数定義 */
    15  T1 v[MAXREC];
    16  T1 *p1 = &v[0];
    17
    18  int main(int argc, char **argv)
    19  {
    20      printf("sizeof(T1)      = %d\n", sizeof(T1));
    21      printf("sizeof(T1)*100  = %d\n", sizeof(p1[0]) * MAXREC);  /* LP64 migration warning */
    22      printf("sizeof(T1)*100L = %d\n", sizeof(p1[0]) * MAXRECL); /* OK                     */
    23      printf("sizeof(T1)*100  = %d\n", sizeof(T1) * MAXREC);     /* LP64 migration warning */
    24      printf("sizeof(T1)*100L = %d\n", sizeof(T1) * MAXRECL);    /* OK                     */
    25      printf("sizeof(T1[100]) = %d\n", sizeof(T1[MAXREC]));      /* OK                     */
    26      printf("sizeof(v)       = %d\n", sizeof(v));
    27
    28      return 0;
    29  }

このソースをコンパイル・実行する。

$ c89 +DA2.0W +DS2.0 +M2 -D_XOPEN_SOURCE=500 ssize.c -o ssize
cc: "ssize.c", line 21: LP64 migration warning 753: * converts 32 bit integer to long
cc: "ssize.c", line 23: LP64 migration warning 753: * converts 32 bit integer to long
$ ./ssize
sizeof(T1)      = 144
sizeof(T1)*100  = 14400
sizeof(T1)*100L = 14400
sizeof(T1)*100  = 14400
sizeof(T1)*100L = 14400
sizeof(T1[100]) = 14400
sizeof(v)       = 14400