AUTOSAR C++14 Rule A2-3-1

Только те символы, заданные в базовом наборе символов исходного кода Стандарта Языка C++, должны использоваться в исходном коде

Описание

Управляйте определением

Только те символы, заданные в базовом наборе символов исходного кода Стандарта Языка C++, должны использоваться в исходном коде.

Объяснение

В стандарте C++ базовый набор символов исходного кода состоит из 96 символов. Они:

  • Пробел.

  • Управляющие символы, такие как горизонтальная вкладка, вертикальная вкладка, перевод формата и новая строка.

  • Прописные и строчные буквы и числа.

  • Специальные символы, такие как _ { } [ ] # ( ) < > % : ; . ? * + - / ^ & | ~ ! = , \ " '.

Используя символы вне этого набора может вызвать беспорядок и неожиданные ошибки. Например, греческая буква "Τ" визуально похожа на английскую букву "T", но они, разделяют символы различными unicode значениями кодовой точки. Чтобы избежать неожиданного поведения, используйте только вышеупомянутые заданные символы в своем исходном коде, включая комментарии и строковые литералы. Можно использовать символы вне этого набора только в двух случаях. Можно использовать:

  • Другие символы в тексте широкой строки или UTF-8 закодированная строка.

  • Символьный @ в комментариях, тексте широкой строки или UTF-8 закодированная строка.

Реализация Polyspace

Polyspace® отмечает символы в вашем исходном коде, которые не находятся в наборе 96 символов, заданных в стандарте C++ за двумя исключениями, которые прибывают из C++ AUTOSAR 14 Стандартов. Polyspace не отмечает:

  • Другие символы в тексте широкой строки или UTF-8 закодированная строка.

  • Символьный @ в комментариях, тексте широкой строки или UTF-8 закодированная строка.

Поиск и устранение проблем

Если вы ожидаете нарушение правила, но не видите его, относитесь, чтобы Диагностировать, Почему Кодирующие Стандартные Нарушения Не Появляются как ожидалось.

Примеры

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

Следующий пример демонстрирует реализацию Polyspace правила A2-3-1 AUTOSAR.

#include <cstdint>

// @ brief foo function    //Compliant by exception
/* @ brief foo function */ //Compliant by exception

#if 0
@ This one is not in a comment  //Noncompliant
#endif
/*Define £ and € as currency */   // Noncompliant 
#define CUR1 "£"   //Noncompliant                         
#define CUR2 "€"   //Noncompliant 
void myfunction(char *str );                        
int  Total = 0;    //Complaint
int  Τotal = 0;    //Noncompliant
void foo()
{
	char *s1 = "Greek Τ  - normal string"; //Noncompliant
	wchar_t *s2 { L"Greek Τ @ wide string"};  //Compliant
	char *s3 = u8"Greek Τ @ UTF-8";          // Compliant 
	char16_t *s4 = u"Greek Τ UTF-16";  //Noncompliant
	char32_t *s5 = U"Greek Τ UTF-32";  //Noncompliant
	char *s6 = "mail@company.com"; //Noncompliant
	myfunction("Greek Τ");//Noncompliant 
	myfunction(s3);//Complaint
}

main(){
	// ..
}

Если ваш код имеет символы, которые не находятся в заданном наборе символов, Polyspace отмечает их. Отметьте глобальные переменные Total и Τotal. Даже при том, что выглядит, как будто они - та же переменная, они - две различных переменные, потому что последний начинается с греческой буквы "Τ". Беспорядок между этими двумя символами может привести к неожиданному поведению. Поскольку греческая буква "Τ" находится вне стандартного набора символов, Polyspace отмечает каждое использование символа, даже те в комментариях и строковых литералах.

Polyspace отмечает каждое использование символов вне заданного набора за следующими исключениями. Можно использовать:

  • Другие символы в широкой строке, такие как s2 или UTF-8 закодированная строка, такая как s3.

  • Символьный @ в широкой строке, такой как s2, UTF-8 закодированная строка, такая как s3, или комментарий.

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

Группа: Лексические соглашения
Категория: необходимый, автоматизированный
Введенный в R2020a