exponenta event banner

Правило AUTOSAR C++ 14 A2-3-1

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

Описание

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

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

Объяснение

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

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

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

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

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

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

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

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

Внедрение Polyspace

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

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

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

Поиск неисправностей

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

Примеры

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

В следующем примере показана реализация правила A2-3-1 AUTOSAR в 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. Несмотря на то, что они выглядят как одна и та же переменная, они являются двумя различными переменными, потому что последняя начинается с греческой буквы " Путаница между этими двумя символами может привести к неожиданному поведению. Поскольку греческая буква «Start» находится вне стандартного набора символов, Polyspace помечает каждое использование символа, даже в комментариях и строковых литералах.

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

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

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

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

Группа: Лексические конвенции
Категория: Обязательно, Автоматизировано
Представлен в R2020a