ビジュアライザ関数におけるelem_node_indexの型不整合

概要

hecmwST_local_mesh 構造体の elem_node_index メンバは long long * 型で定義されているが、ビジュアライザ (hecmw_fstr_output_femap.c) 内の複数の関数では引数やローカル変数が int * 型で宣言されており、型の不整合が存在する。

問題の詳細

hecmw_struct.h における定義:

long long *elem_node_index;

これに対し、ビジュアライザの関数は int * で宣言されている:

static void femap_write_elem(FILE *outfp, ..., int *elem_node_index, ...);
static void avs_write_elem_conn(FILE *outfp, ..., int *elem_node_index, ...);

また、受信バッファも int * として確保・使用されている:

int *tmp_elem_node_index;
tmp_elem_node_index = (int *)HECMW_calloc(tmp_int + 1, sizeof(int));

これらの関数に mesh->elem_node_index (long long *) を渡すと、暗黙のポインタ型変換 (incompatible pointer types) が発生する。加えて、MPI通信においても HECMW_INT で送受信しているため、long long 値の上位ビットが失われ、大規模メッシュではデータ破壊が生じうる。

影響

  • コンパイラの -Wincompatible-pointer-types 警告(新しいGCCでは、FLAGSを付けないとエラー)の対象となる
  • sizeof(int) で確保したバッファに long long 相当のデータを格納しようとし、メモリ破壊のリスクがある
  • 要素ノードインデックスの値が INT_MAX を超える大規模メッシュで顕在化する

根本原因

HECMW の通信ラッパーが long long に対応するデータ型識別子 (HECMW_LONG_LONG) を持っていなかったため、ビジュアライザ側で elem_node_index を正しい型で扱う手段がなく、int * のまま放置されていた。

期待する修正

  1. hecmw_config.h に HECMW_LONG_LONG データ型識別子を追加する
  2. hecmw_comm.c および hecmw_couple_comm.c の通信ラッパーに long long サポートを追加する
  3. ビジュアライザの関数引数・ローカル変数の型およびMPI通信のデータ型を long long / HECMW_LONG_LONG に修正する