FORWARD_NULL против UNINIT Ошибки скрытия в C - PullRequest
0 голосов
/ 13 ноября 2018

, когда указатель инициализируется значением NULL, получая ошибки покрытия "FORWARD_NULL", а когда инициализация NULL удаляется, он генерирует ошибки покрытия UNINIT.Код такой, как показано ниже.

Я очень новичок в укрывательстве.Если это очень простой вопрос, пожалуйста, помогите.

Я

1) объявляю указатель,

2) Инициализируем его в NULL и

3) отложить его, не назначая ему ничего.

Эта задержка является аргументом в вызове функции, внутри которого он будет заполнен. Получение ошибок FORWARD_NULL для того же самого.Начал с работ Coverity, только со вчерашнего дня.

int fn1()
{
    strct1 *pvarA = NULL;
    if (fn2(&pvarA) != 0) // derefering NULL pointer error.
    {
        return 1;
    }
    ...
    /* some code */
}

int fn2(strct1 **pvarA)
{
    ...
    /* some code */
    *pvarA = varA;
    /* some code */
    return 0;
}

Спасибо, Preethi

Ответы [ 2 ]

0 голосов
/ 24 января 2019

Это помогает легко:

#include<stdio.h>
#include<string.h>
#include<stdlib.h>

strct1
{
    int a;
    int b;
    char c;
};

int fn1()
{
    strct1 *pvarA = NULL;
    strct1 varA;

    MEMSET(&varA, 0, sizeof (strct1));
    pvarA = &varA;
    if (fn2(&pvarA) != 0) // derefering NULL pointer error.
    {
        return 1;
    }
    /* some code */
}

int fn2(strct1 **pvarA)
{
    /* some code */
    *pvarA = varA;
    /* some code */
    return 0;
}
0 голосов
/ 13 ноября 2018

В таком коде:

int fn1(int **ar)
{
    int *a;
    a = *ar;
}

Переменная a не инициализируется (таким образом UNINIT), а переменная ar разыменовывается без проверки на нулевое значение (таким образом FORWARD_NULL).

Возможно, этот код будет работать:

#include <stddef.h>
#include <stdlib.h>
#include <stdio.h>

int fn1(int **ar)
{
   int *a = NULL;
   if (ar == NULL) {
        fprintf(stderr, "Omg! you passed NULL as first argument to fn1 function. What to do now? Break the program flow for sure - return or abort() or exit() !");
        abort();
        return EXIT_FAILURE;
    }
    a = *ar;
    return EXIT_SUCCESS;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...