exponenta event banner

Неинициализированная локальная переменная

Локальная переменная не инициализирована перед чтением

Описание

Эта проверка выполняется для каждой считанной локальной переменной. Определяет, инициализирована ли считываемая переменная.

Примеры

развернуть все

#include <stdio.h>
    
void main(void) {
   int sum;
   for(int i=1;i <= 10; i++)
      sum+=i;
   printf("The sum of the first 10 natural numbers is %d.", sum);
 }

Заявление sum+=i; является кратким для sum=sum+i;. Поскольку sum используется в правой части выражения перед инициализацией, проверка неинициализированной локальной переменной возвращает красную ошибку.

Исправление - инициализация переменной перед использованием справа от назначения

Одной из возможных корректировок является инициализация sum до for цикл.

#include <stdio.h>
    
void main(void) {
   int sum=0;
   for(int i=1;i <= 10; i++)
      sum+=i;
   printf("The sum of the first 10 natural numbers is %d.", sum);
 }
#include <stdio.h>
    
int getTerm();
    
void main(void) {
    int count,sum=0,term;
    
    while( count <= 10  && sum <1000) {
       count++;
       term = getTerm();
       if(term > 0 && term <= 1000) sum += term;
      }
    
    printf("The sum of 10 terms is %d.", sum);
 }

В этом примере переменная count не инициализирован перед сравнением count <= 10. Поэтому проверка неинициализированных локальных переменных возвращает красную ошибку.

Исправление - инициализация переменной перед использованием с реляционным оператором

Одной из возможных корректировок является инициализация count перед сравнением count <= 10.

#include <stdio.h>
    
int getTerm();
    
void main(void) {
    int count=1,sum=0,term;
    
    while( count <= 10  && sum <1000) {
       count++;
       term = getTerm();
       if(term > 0 && term <= 1000) sum+= term;
      }
    
    printf("The sum of 10 terms is %d.", sum);
 }
#include <stdio.h>

int getShift();
int shift(int var) {
    int shiftVal = getShift();
    if(shiftVal > 0 && shiftVal < 1000)
        return(var+shiftVal);
    return 1000;
}
    
void main(void) {
    int initVal;
    printf("The result of a shift is %d",shift(initVal));
}

В этом примере: initVal не инициализируется при передаче shift(). Поэтому проверка неинициализированных локальных переменных возвращает красную ошибку. Из-за красной ошибки Polyspace ® не проверяет операции в shift().

Исправление - инициализация переменной перед передачей функции

Одной из возможных корректировок является инициализация initVal перед переходом к shift(). initVal может быть инициализирован посредством функции ввода. Чтобы избежать переполнения, значение, возвращаемое функцией ввода, должно находиться в пределах границ.

#include <stdio.h>

int getShift();
int getInit();
int shift(int var) {
    int shiftVal = getShift();
    if(shiftVal > 0 && shiftVal < 1000)
        return(var+shiftVal);
    return 1000;
}
    
void main(void) {
   int initVal=getInit();
   if(initVal >0 && initVal < 1000)
     printf("The result of a shift is %d",shift(initVal));
   else
     printf("Value must be between 0 and 1000.");
 }
#include <stdio.h>
#define arrSize 19
 
void main(void)
{
  int arr[arrSize],indexFront, indexBack;
  for(indexFront = 0,indexBack = arrSize - 1; 
    indexFront < arrSize/2; 
    indexFront++, indexBack--) {
    arr[indexFront] = indexFront;
    arr[indexBack] = arrSize - indexBack - 1;
  }
  printf("The array elements are: \n");
  for(indexFront = 0; indexFront < arrSize; indexFront++)
    printf("Element[%d]: %d", indexFront, arr[indexFront]);
 }

В этом примере в первом for цикл:

  • indexFront выполняется от 0 до 8.

  • indexBack проходит с 18 по 10.

Поэтому arr[9] не инициализирован. Во втором for цикл, когда arr[9] передается в printf, проверка неинициализированной локальной переменной возвращает ошибку. Ошибка оранжевого цвета, поскольку проверка возвращает ошибку только в одном из циклов.

Из-за оранжевой ошибки в одном из циклов на втором появляется красная ошибка не завершающего цикла for цикл.

Исправление - инициализация переменной перед передачей функции

Одной из возможных корректировок является сохранение первого for цикл не поврежден и инициализирован arr[9] за пределами for цикл.

#include <stdio.h>
#define arrSize 19
 
void main(void)
{
  int arr[arrSize],indexFront, indexBack;
  for(indexFront = 0,indexBack = arrSize - 1;
    indexFront < arrSize/2; 
    indexFront++, indexBack--) {
    arr[indexFront] = indexFront;
    arr[indexBack] = arrSize - indexBack - 1;
  }
  arr[indexFront] = indexFront;
  printf("The array elements are: \n");
  for(indexFront = 0; indexFront < arrSize; indexFront++)
    printf("Element[%d]: %d", indexFront, arr[indexFront]);
}
typedef struct S { 
   int integerField; 
   char characterField;
}S;

void operateOnStructure(S);
void operateOnStructureField(int);

void main() {
  S myStruct;
  operateOnStructure(myStruct);
  operateOnStructureField(myStruct.integerField);
}

В этом примере структура myStruct не инициализирован. Следовательно, когда структура myStruct передается функции operateOnStructure, неинициализированная проверка локальной переменной в структуре отображается красным цветом.

Коррекция - инициализация структуры

Одной из возможных корректировок является инициализация структуры. myStruct перед передачей функции.

typedef struct S { 
   int integerField; 
   char characterField;
}S;

void operateOnStructure(S);
void operateOnStructureField(int);

void main() {
  S myStruct = {0,' '};
  operateOnStructure(myStruct);
  operateOnStructureField(myStruct.integerField);
}
typedef struct S { 
   int integerField; 
   char characterField;
   double doubleField;
}S;

int getIntegerField(void);
char getCharacterField(void);

void printIntegerField(int);
void printCharacterField(char);

void printFields(S s) {
 printIntegerField(s.integerField);
 printCharacterField(s.characterField);
}

void main() {
  S myStruct;
  
  myStruct.integerField = getIntegerField();
  myStruct.characterField = getCharacterField();
  printFields(myStruct);
}

В этом примере проверка неинициализированной локальной переменной включена myStruct зеленый, потому что:

  • Области integerField и characterField которые используются, инициализируются.

  • Хотя поле doubleField не инициализирован, операции чтения или записи в поле отсутствуют doubleField в коде.

Чтобы определить, какие поля проверяются для инициализации:

  1. Установите флажок на панели Список результатов (Results List) или Источник (Source).

  2. Просмотрите сообщение на панели Сведения о результатах.

Следует отметить, что в особом случае, когда ни одно из полей не используется, проверка инициализации выполняется оранжевым, а не зеленым цветом, если все поля не инициализированы.

typedef struct S { 
   int integerField; 
   char characterField;
   double doubleField;
}S;

int getIntegerField(void);
char getCharacterField(void);

void printIntegerField(int);
void printCharacterField(char);
void printDoubleField(double);

void printFields(S s) {
 printIntegerField(s.integerField);
 printCharacterField(s.characterField);
 printDoubleField(s.doubleField);
}

void main() {
  S myStruct;
  
  myStruct.integerField = getIntegerField();
  myStruct.characterField = getCharacterField();
  printFields(myStruct);
}

В этом примере проверка неинициализированной локальной переменной включена myStruct оранжевый, потому что:

  • Области integerField и characterField которые используются, инициализируются.

  • Область doubleField не инициализирован и имеется операция чтения doubleField в коде.

Чтобы определить, какие поля проверяются для инициализации:

  1. Установите флажок на панели Список результатов (Results List) или Источник (Source).

  2. Просмотрите сообщение на панели Сведения о результатах.

Проверить информацию

Группа: Поток данных
Язык: C | C++
Акроним: NIVL