AUTOSAR C++14 Rule A2-3-1

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

Описание

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

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

Объяснение

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

  • Пробел.

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

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

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

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

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

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

Реализация Polyspace

Polyspace® отмечает символы в вашем исходном коде, которые не находятся в наборе 96 символов, заданных в стандарте C++ за двумя исключениями. 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