OpenMPI  0.1.1
convert.h File Reference

This file will hopefully not last long in the tree, but it's unfortunately necessary for now. More...

#include "opal_config.h"

Go to the source code of this file.

Functions

BEGIN_C_DECLS OPAL_DECLSPEC int opal_size2int (size_t in, int *out, bool want_check) __opal_attribute_nonnull__(2)
 Convert a size_t to an int. More...
 

Detailed Description

This file will hopefully not last long in the tree, but it's unfortunately necessary for now.

There are multiple places in the code base where we need to safely convert from a size_t to an int. However, on some platforms, sizeof(size_t) is larger than sizeof(int), so casting from size_t -> int will result in a compiler warning and potentially data truncation.

But, unfortunately, we still need to do it. But we definitely do not want compiler warnings. So when sizeof(size_t)>sizeof(int), the solution is the treat the size_t value like an array and dereference the appropriate nibble and cast that to an int (which accounts for both big and little endian machines).

Most places in the code where this casting must occur are because collision of APIs (e.g., one API requires a size_t and another API requires an int. And in most places, we're not going to overflow the int when casting down into it (e.g., it's the result of a strlen, or the length of the buffer in an ompi_buffer_t – if that buffer is larger than MAX_INT, we've got other problems!).

BUT – the whole premise of casting down to an int is dangerous. So we provide extra protection here to detect overflow situations and print out appropriate warnings. So if this situation ever occurs, we'll still overflow, but we'll have a good indication that it's happening, and where.

Function Documentation

BEGIN_C_DECLS OPAL_DECLSPEC int opal_size2int ( size_t  in,
int *  out,
bool  want_check 
)

Convert a size_t to an int.

Parameters
inThe size_t value to be converted
outThe output int value.
want_checkWhether to check for truncation or not
Returns
OPAL_SUCESS If all went well
OPAL_NOT_SUPPORTED if the size_t value was truncated

The conversion will always occur. However, if the size_t value was truncated (i.e., sizeof(size_t) > sizeof(int), and the cast down to the int actually changed the value), OPAL_NOT_SUPPORTED will be returned.

On platforms where sizeof(size_t) <= sizeof(int), this function will aways return OPAL_SUCCESS.