Локальная переменная не инициализирована перед чтением
Эта проверка выполняется для каждой считанной локальной переменной. Определяет, инициализирована ли считываемая переменная.
Просмотр и исправление неинициализированных локальных проверок переменных
#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 в коде.
Чтобы определить, какие поля проверяются для инициализации:
Установите флажок на панели Список результатов (Results List) или Источник (Source).
Просмотрите сообщение на панели Сведения о результатах.
Следует отметить, что в особом случае, когда ни одно из полей не используется, проверка инициализации выполняется оранжевым, а не зеленым цветом, если все поля не инициализированы.
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 в коде.
Чтобы определить, какие поля проверяются для инициализации:
Установите флажок на панели Список результатов (Results List) или Источник (Source).
Просмотрите сообщение на панели Сведения о результатах.
| Группа: Поток данных |
| Язык: C | C++ |
| Акроним: NIVL |
1. Если смысл перевода понятен, то лучше оставьте как есть и не придирайтесь к словам, синонимам и тому подобному. О вкусах не спорим.
2. Не дополняйте перевод комментариями “от себя”. В исправлении не должно появляться дополнительных смыслов и комментариев, отсутствующих в оригинале. Такие правки не получится интегрировать в алгоритме автоматического перевода.
3. Сохраняйте структуру оригинального текста - например, не разбивайте одно предложение на два.
4. Не имеет смысла однотипное исправление перевода какого-то термина во всех предложениях. Исправляйте только в одном месте. Когда Вашу правку одобрят, это исправление будет алгоритмически распространено и на другие части документации.
5. По иным вопросам, например если надо исправить заблокированное для перевода слово, обратитесь к редакторам через форму технической поддержки.