Объявление той же функции или объекта несовместимыми способами
Эта проверка деактивирована в Polyspace по умолчанию® по мере анализа You Code. Смотрите Checkers Deactivated in Polyspace как You Code Default Analysis (Polyspace Bug Finder Access).
Объявление той же функции или объекта несовместимыми способами.[1]
Эта проверка проверяет на наличие следующих проблем:
Неотличимые имена внешних идентификаторов.
Несоответствие объявления.
Проблема возникает, когда внешние идентификаторы не различны.
Внешние идентификаторы являются таковыми, объявленными с глобальными возможностями или классом памяти extern
.
Polyspace рассматривает два имени как различные, если существует различие между их первыми 31 символами. Если различие между двумя именами происходит только за пределами первых 31 символов, их можно легко принять друг за друга. Уменьшается читаемость кода. Для C90 различие должна быть между первыми 6 символами. Чтобы использовать проверку правил C90, используйте значение c90
для опции C standard version (-c-version)
.
int engine_temperature_raw; int engine_temperature_scaled; /* Non-compliant */ int engin2_temperature; /* Compliant */
В этом примере идентификатор engine_temperature_scaled
имеет те же первые шесть символов, что и предыдущий идентификатор, engine_temperature_raw
.
int engine_exhaust_gas_temperature_raw; int engine_exhaust_gas_temperature_scaled; /* Non-compliant */ int eng_exhaust_gas_temp_raw; int eng_exhaust_gas_temp_scaled; /* Compliant */
В этом примере идентификатор engine_exhaust_gas_temperature_scaled
имеет те же первые 31 символ, что и предыдущий идентификатор, engine_exhaust_gas_temperature_raw
.
/* file1.c */ int abc = 0;
/* file2.c */ int ABC = 0; /* Non-compliant */
В этом примере реализация поддерживает 6 значащих без учета регистра символов во внешних идентификаторах. Идентификаторы в двух переводах различаются, но не различаются значимыми символами.
Несоответствие объявления происходит, когда объявление функции или переменной не совпадает с другими образцами функции или переменной.
Когда происходит несоответствие между двумя объявлениями переменных в разных модулях компиляции, типичный линкер следует алгоритму, чтобы выбрать одно объявление для переменной. Если вы ожидаете объявления переменной, которое отличается от выбранного линкером, можно увидеть неожиданные результаты, когда используется переменная.
Аналогичная проблема может возникнуть при несоответствии в объявлениях функций.
Исправление зависит от типа несоответствия объявления. Если оба объявления действительно ссылаются на один и тот же объект, используйте одно и то же объявление. Если объявления ссылаются на различные объекты, измените имена одной из переменных. Если вы меняете имя переменной, не забудьте изменить ее во всех местах, где она используется.
Иногда несоответствия объявления могут возникнуть, потому что на объявления влияют предыдущие директивы предварительной обработки. Например, объявление происходит в макросе, и макрос определяется на одном пути включения, но не определен в другом. Эти несоответствия деклараций могут быть сложными для отладки. Идентифицируйте расхождения между двумя путями включения и исправьте конфликтующие определения макросов.
Если вы не хотите устранять проблему, добавьте комментарии к своему результату или коду, чтобы избежать другой проверки. Смотрите Адрес Результаты Polyspace через исправления ошибок или обоснования.
file1.c
int foo(void) { return 1; }
file2.c
double foo(void);
int bar(void) {
return (int)foo();
}
В этом примере file1.c объявляет foo()
как возвращающее целое число. В файле 2.c, foo()
объявляется как возврат double. Это различие вызывает дефект во втором образце foo
в файле 2.
Одной из возможных коррекций является изменение объявлений функций таким образом, чтобы они совпадали. В этом примере путем изменения объявления foo
в file2.c, чтобы соответствовать file1.c, дефект исправлен.
file1.c
int foo(void) { return 1; }
file2.c
int foo(void); int bar(void) { return foo(); }
test1.c #include "square.h" #include "circle.h" struct aCircle circle; struct aSquare square; int main(){ square.side=1; circle.radius=1; return 0; } | test2.c #include "circle.h" #include "square.h" struct aCircle circle; struct aSquare square; int main(){ square.side=1; circle.radius=1; return 0; } |
circle.h #pragma pack(1) extern struct aCircle{ int radius; } circle; | square.h extern struct aSquare {
unsigned int side:1;
} square; |
В этом примере дефект несоответствия объявлений возникает на square
в square.h, потому что Polyspace делает вывод, что square
в square.h не имеет такой выравнивания, как square
в тесте2.c. Эта ошибка возникает из-за #pragma pack(1)
оператор в circle.h объявляет конкретное выравнивание. В тесте2.c, circle.h включается до square.h. Поэтому #pragma pack(1)
оператор из circle.h не сбрасывается на выравнивание по умолчанию после aCircle
структура. Из-за этого упущения test2.c делает вывод, что aSquare square
структура также имеет выравнивание 1
байт.
Одной из возможных коррекций является сброс выравнивания структуры после aCircle
struct. Для GNU® или Microsoft® Визуальные компиляторы, исправьте дефект, добавив #pragma pack()
оператор в конце файла circle.h.
test1.c #include "square.h" #include "circle.h" struct aCircle circle; struct aSquare square; int main(){ square.side=1; circle.radius=1; return 0; } | test2.c #include "circle.h" #include "square.h" struct aCircle circle; struct aSquare square; int main(){ square.side=1; circle.radius=1; return 0; } |
circle.h #pragma pack(1) extern struct aCircle{ int radius; } circle; #pragma pack() | square.h #extern struct aSquare { unsigned int side:1; } square; |
Другие компиляторы требуют различных #pragma pack
синтаксис. Синтаксис см. в документации для компилятора.
Ignore pragma pack directives
ОпцияОдной из возможных коррекций является добавление Ignore pragma pack directives
опция для анализа Bug Finder. Если требуется изменить выравнивание структуры для каждой структуры, и вы не хотите видеть этот Declaration mismatch дефект, используйте эту коррекцию.
На панели Строении выберите панель Advanced Settings.
В Other поле введите -ignore-pragma-pack
.
Перезапустите анализ.
Дефект Declaration mismatch устранен.
Решимость: Решаема |
[1] Выдержки из стандарта «Техническая спецификация ISO/IEC TS 17961 - 2013-11-15» воспроизводятся с согласия АФНОР. Только оригинальный и полный текст стандарта, опубликованный AFNOR Editions - доступный через веб-сайт www.boutique.afnor.org - имеет нормативное значение.
1. Если смысл перевода понятен, то лучше оставьте как есть и не придирайтесь к словам, синонимам и тому подобному. О вкусах не спорим.
2. Не дополняйте перевод комментариями “от себя”. В исправлении не должно появляться дополнительных смыслов и комментариев, отсутствующих в оригинале. Такие правки не получится интегрировать в алгоритме автоматического перевода.
3. Сохраняйте структуру оригинального текста - например, не разбивайте одно предложение на два.
4. Не имеет смысла однотипное исправление перевода какого-то термина во всех предложениях. Исправляйте только в одном месте. Когда Вашу правку одобрят, это исправление будет алгоритмически распространено и на другие части документации.
5. По иным вопросам, например если надо исправить заблокированное для перевода слово, обратитесь к редакторам через форму технической поддержки.