Remove a sketchy use of asprintf() passing a union by value.
The original code was passing a union by value, and doing odd things on Solaris/SPARC (where "odd" rhymes with "SIGBUS"). Replace it with an exploded switch/case block for all the enum values. Also use the string literals so that we get compiler checking of the format string vs. the type of the actual arguments. cmr=v1.7.4:revier=hjelmn:subject=Fix MCA base var to not pass union by value This commit was SVN r30276.
Этот коммит содержится в:
родитель
91c4890886
Коммит
e3f818ba87
@ -80,17 +80,6 @@ const char *var_type_names[] = {
|
|||||||
"double"
|
"double"
|
||||||
};
|
};
|
||||||
|
|
||||||
const char *var_type_formats[] = {
|
|
||||||
"%d",
|
|
||||||
"%u",
|
|
||||||
"%lu",
|
|
||||||
"%llu",
|
|
||||||
"%" PRIsize_t,
|
|
||||||
"%s",
|
|
||||||
"%d",
|
|
||||||
"%lf"
|
|
||||||
};
|
|
||||||
|
|
||||||
const size_t var_type_sizes[] = {
|
const size_t var_type_sizes[] = {
|
||||||
sizeof (int),
|
sizeof (int),
|
||||||
sizeof (unsigned),
|
sizeof (unsigned),
|
||||||
@ -1688,10 +1677,35 @@ static int var_value_string (mca_base_var_t *var, char **value_string)
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (NULL == var->mbv_enumerator) {
|
if (NULL == var->mbv_enumerator) {
|
||||||
if (MCA_BASE_VAR_TYPE_STRING == var->mbv_type) {
|
switch (var->mbv_type) {
|
||||||
ret = asprintf (value_string, "%s", value->stringval ? value->stringval : "");
|
case MCA_BASE_VAR_TYPE_INT:
|
||||||
} else {
|
ret = asprintf (value_string, "%d", value->intval);
|
||||||
ret = asprintf (value_string, var_type_formats[var->mbv_type], value[0]);
|
break;
|
||||||
|
case MCA_BASE_VAR_TYPE_UNSIGNED_INT:
|
||||||
|
ret = asprintf (value_string, "%u", value->uintval);
|
||||||
|
break;
|
||||||
|
case MCA_BASE_VAR_TYPE_UNSIGNED_LONG:
|
||||||
|
ret = asprintf (value_string, "%lu", value->ulval);
|
||||||
|
break;
|
||||||
|
case MCA_BASE_VAR_TYPE_UNSIGNED_LONG_LONG:
|
||||||
|
ret = asprintf (value_string, "%llu", value->ullval);
|
||||||
|
break;
|
||||||
|
case MCA_BASE_VAR_TYPE_SIZE_T:
|
||||||
|
ret = asprintf (value_string, "%" PRIsize_t, value->sizetval);
|
||||||
|
break;
|
||||||
|
case MCA_BASE_VAR_TYPE_STRING:
|
||||||
|
ret = asprintf (value_string, "%s",
|
||||||
|
value->stringval ? value->stringval : "");
|
||||||
|
break;
|
||||||
|
case MCA_BASE_VAR_TYPE_BOOL:
|
||||||
|
ret = asprintf (value_string, "%d", value->boolval);
|
||||||
|
break;
|
||||||
|
case MCA_BASE_VAR_TYPE_DOUBLE:
|
||||||
|
ret = asprintf (value_string, "%lf", value->lfval);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
ret = -1;
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
ret = (0 > ret) ? OPAL_ERR_OUT_OF_RESOURCE : OPAL_SUCCESS;
|
ret = (0 > ret) ? OPAL_ERR_OUT_OF_RESOURCE : OPAL_SUCCESS;
|
||||||
|
Загрузка…
x
Ссылка в новой задаче
Block a user