ПРЕДВАРИТЕЛЬНАЯ аннотация для членов структуры

В коде моей компании у нас есть общие методы get() и set() для взаимодействия между определенными компонентами. Однако, если я пытаюсь запустить PREfast, я получаю предупреждения, потому что PREfast не понимает, что метод get() инициализирует заданные параметры.

Проблема в том, что, поскольку эти методы очень общие, они не просто принимают параметр (который я мог бы пометить _Out_ или аналогичные, но массив структур, который содержит данные о том, какие данные должны быть возвращены.

В коде (значительно упрощено):

typedef struct
{
    int type;
    int* data;
} ARGS;

void get(int count, ARGS* args)
{
    for (int i = 0; i < count; i++)
        *(args[i].data) = 42; // Actually handled by internal methods
}

// Sample Usage
void foo()
{
    int value;
    ARGS args[1];

    args[0].type = 1234;
    args[0].data = &value;

    get(1, args);

    // Do something with value
    // PREfast complains that value is uninitialized (error C6001)
    printf("%d", value);
}

Есть ли способ аннотировать это, чтобы PREfast знал, что args.data инициализируется get()? Или это слишком сложно для PREfast, чтобы справиться?

РЕДАКТИРОВАТЬ: если я использую get(1, &args)затем предупреждение уходит. Так что в PREfast есть некоторая эвристика, которая может справиться с этим случаем, но я не выяснил, можно ли вызвать его внешне:

void get2(int count, ARGS(* args)[1]) // Needs the size of args, or it won't compile below
{
    for (int i = 0; i < count; i++)
        *(*args)[i].data = 42; // Actually handled by internal methods
}

// Sample Usage
void foo2()
{
    int value;
    ARGS args[1];

    args[0].type = 1234;
    args[0].data = &value;

    get2(1, &args);

    // Do something with value
    printf("%d", value);
}

1 ответ

Это должно исправить предупреждение.

void foo()
{
   int value=0;
  ...
}

Обратите внимание, что get() будет вызываться только во время выполнения. Поскольку PREfast является инструментом статического анализа, он может сообщить, что значение неинициализировано. Тем не менее, инициализация переменной перед использованием всегда является лучшей практикой в ​​C.

Другим способом было бы использовать PREfast suppress как показано ниже:

void foo()
{
    int value;
    ARGS args[1];

    args[0].type = 1234;
    args[0].data = &value;

    get(1, args);

    // Do something with value
    // PREfast complains that value is uninitialized (error C6001)
    #pragma prefast(suppress:C6001 , "PREfast noise: the variable value will be initialized by get method in a line above")
    printf("%d", value);
}

Он подавляет предупреждения в следующей строке после оператора подавления.

Кроме того, добавьте следующий код в заголовочные файлы (или исходные файлы) непосредственно перед использованием pragma prefast в вашем коде:

#ifndef _PREFAST_
#pragma warning(disable:4068)
#endif

чтобы избежать 4068 предупреждения, которое будет отмечено. ПРИМЕЧАНИЕ: pragma prefast является расширением только для компилятора PREfast AST и может не поддерживаться другими компиляторами.

Другие вопросы по тегам