ビジュアライザ関数における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 * のまま放置されていた。
期待する修正
-
hecmw_config.hにHECMW_LONG_LONGデータ型識別子を追加する -
hecmw_comm.cおよびhecmw_couple_comm.cの通信ラッパーにlong longサポートを追加する - ビジュアライザの関数引数・ローカル変数の型およびMPI通信のデータ型を
long long/HECMW_LONG_LONGに修正する