Превышение границ за пределами разыменованного указателя - PullRequest
0 голосов
/ 22 ноября 2018

Пожалуйста, рассмотрите следующую структуру C, реализующую очень простой кольцевой буфер:

struct shm_buffer_s {
    pthread_mutex_t shm_mutex;
    uint16_t head;
    uint16_t tail;
    struct shm_node_s node[SHM_NODES_MAX];
};

Затем у меня есть функция для вставки нового набора данных в буфер:

uint32_t PushDataset(const struct shm_dataset_s *dataset, struct shm_buffer_s *const input_buf)
{
    uint32_t return_value = MEM_MGMT_SHM_ERROR;
    uint16_t head_index = 0;
    size_t payload_size = 0;

    if((dataset == NULL) || (input_buf == NULL)){
        return_value = MEM_MGMT_SHM_NULL_ERROR;
    }
    else if(pthread_mutex_lock(&input_buf->shm_mutex) != 0){
        return_value = MEM_MGMT_SHM_MUTEX_ERROR;
    }
    else{
        head_index = input_buf->head;
        /* ...Rest of the function... */
    }

    return return_value;
}/*PushDataset*/

Статический анализпомечает это разыменование для head как потенциальную ошибку за пределами допустимого диапазона.Вся программа работает нормально, вызывающая функция резервирует память для input_buf правильно, и я не получаю таких ошибок, например, в версии «Pop», которая выглядит так:

SI_32 PopDataset(struct shm_dataset_s *const dataset, struct shm_buffer_s *const output_buf)
{
    SI_32 return_value = MEM_MGMT_SHM_ERROR;
    UI_16 tail_index = 0;
    size_t payload_size = 0;

    if((dataset == NULL) || (output_buf == NULL)){
        return_value = MEM_MGMT_SHM_NULL_ERROR;
    }
    else if(pthread_mutex_lock(&output_buf->shm_mutex) != 0){
        return_value = MEM_MGMT_SHM_MUTEX_ERROR;
    }
    else{
        /* Clear output dataset in case it wasn't initialized */
        memset(dataset, 0, sizeof(struct shm_dataset_s));

        tail_index = output_buf->tail;

        /* ...Rest of the function... */

    return return_value;
}/*PopDataset*/

Области памяти, на которые указывает struct shm_buffer_s *, являются областями общей памяти, созданными вызывающей функцией.

...