AUTOSAR C++14 Rule A2-3-1

В исходном коде должны использоваться только символы, указанные в базовом наборе исходных символов стандарта C++ Language Standard.

Описание

Определение правила

В исходном коде должны использоваться только символы, указанные в базовом наборе исходных символов стандарта C++ Language Standard.

Объяснение

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

  • Символ пробел.

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

  • Буквы верхнего и нижнего регистров и цифры.

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

Использование символов вне этого набора может вызвать путаницу и неожиданные ошибки. Например, греческая буква «И» визуально похожа на английскую букву «Т», но они являются отдельными символами с различными значениями кодовой точки Юникода. Чтобы избежать неожиданного поведения, используйте в исходном коде только указанные выше символы, включая комментарии и строковые литералы. Символы за пределами этого набора можно использовать только в двух случаях. Вы можете использовать:

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

  • Область символа @ внутренние комментарии, текст широкой строки или UTF-8 закодированной строки.

Реализация Polyspace

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

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

  • Область символа @ внутренние комментарии, текст широкой строки или UTF-8 закодированной строки.

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

Если вы ожидаете нарушения правил, но не видите его, обратитесь к разделу «Стандартные нарушения кодирования не отображаются».

Примеры

расширить все

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

#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