• Imagix 4D ユーザガイド
  • 目次

AUTOSAR C++14チェックリスト

AUTOSAR C++14規格は、ISO/IEC 14882:2014で定義されたC++14言語の使用に関するコーディングガイドラインを規定しており、これは安全関連およびクリティカルなシステムに適用されます。主なアプリケーション分野は自動車ですが、その他の組み込みアプリケーション分野でも使用できます。

AUTOSAR C++14は、MISRA C++ 2008の更新版として定義されています。 MISRA C++から変更なしに採用されるルールは、その全内容を繰り返すことなく、規格内でIDおよびルールテキストによってのみ参照されます。そのため、AUTOSAR C++規格の読者には、MISRA C++ 2008規格が必要な前提条件となります。AUTOSARに関する詳細はAUTOSARのウェブサイトを参照してください。

ほとんどのルールは、静的解析によって自動的に強制可能です。 部分的に強制可能なもの、あるいは強制不可能なものもあり、これらは手動のコードレビューによって強制する必要があります。これらは☑でマークされています。

ほとんどのルールは、コードの書き方に関する典型的なコーディングガイドラインです。ただし、MISRA C+++:2008に比べて一部のルールが緩和されているため(例:例外および動的メモリの使用が許可されている)、コンパイラツールチェーンおよびプロセスに関連するルールや、分析またはテストに関するものも含まれています。これらのルールはドキュメンテーションのために含まれ、⚯でマークされています。

最後に、いくつかのルールでは、Imagix 4Dの表示および解析ツールを使用して、これらの状況が発生する場所を特定するようユーザーに要求します。これらのルールは⚙でマークされています。

このチェックリストでレビューされるソフトウェアは、-nosysオプションを無効にし、-nosysbodiesオプションを有効にしてImagix 4Dにロードする必要があります。

The word AUTOSAR and the AUTOSAR logo are registered trademarks. "MISRA" is a registered trademark owned by HORIBA MIRA Ltd, held on behalf of the MISRA Consortium.

AUTOSAR C++14 チェック

Rule M0-1-1 A project shall not contain unreachable code.
Rule M0-1-2 A project shall not contain infeasible paths.
Rule M0-1-3 A project shall not contain unused variables.
Rule M0-1-4 A project shall not contain non-volatile POD variables having only one use.
Rule A0-1-1 A project shall not contain instances of non-volatile variables being given values that are never subsequently used.
Rule A0-1-2 The value returned by a function having a non-void return type that is not an overloaded operator shall always be used.
Rule M0-1-8 All functions with void return type shall have external side effect(s).
Rule M0-1-9 There shall be no dead code.
Rule M0-1-10 Every defined function shall be called at least once.
Rule A0-1-3 Every function defined in an anonymous namespace, or static function with internal linkage, or private member function shall be used.
Rule A0-1-4 There shall be no unused named parameters in non-virtual functions.
Rule A0-1-5 There shall be no unused named parameters in the set of parameters for a virtual function and all the functions that override it.
Rule A0-1-6 There should be no unused type declarations.
Rule M0-2-1 An object shall not be assigned to an overlapping object.
Rule M0-3-1 Minimization of run-time failures shall be ensured.
Rule M0-3-2 If a function generates error information, then that error information shall be tested.
Rule M0-4-1 Use of scaled-integer or fixed-point arithmetic shall be documented.
Rule M0-4-2 Use of floating-point shall be documented.
Rule A0-4-1 Floating-point implementation shall comply with IEEE 754 standard.
Rule A0-4-2 Type long double shall not be used.
Rule A0-4-3 The implementations in the chosen compiler shall strictly comply with the C++14 Language Standard.
Rule A0-4-4 Range, domain and pole errors shall be checked when using math functions.
Rule A1-1-1 All code shall conform to ISO/IEC 14882:2014 - Programming Language C++ and shall not use deprecated features.
Rule M1-0-2 Multiple compilers shall only be used if they have a common, defined interface.
Rule A1-1-2 A warning level of the compilation process shall be set in compliance with project policies.
Rule A1-1-3 An optimization option that disregards strict standard compliance shall not be turned on in the chosen compiler.
Rule A1-2-1 Tool confidence level of the chosen compiler.
Rule A1-4-1 Code metrics.
Rule A1-4-3 All code should compile free of compiler warnings.
Rule A2-3-1 Only those characters specified in the C++ Language Standard basic source character set shall be used in the source code.
Rule A2-5-1 Trigraphs shall not be used.
Rule A2-5-2 Digraphs should not be used.
Rule M2-7-1 The character sequence /* shall not be used within a C-style comment.
Rule A2-7-2 Sections of code shall not be "commented out".
Rule A2-7-3 All declarations of "user-defined" types, data members, functions and methods shall be preceded by documentation.
Rule A2-7-4 The character \ shall not occur as a last character of a C++ comment.
Rule A2-7-5 Comments shall not document any actions or sources that are outside of the file.
Rule A2-8-1 A header file name should reflect the logical entity for which it provides declarations.
Rule A2-8-2 An implementation file name should reflect the logical entity for which it provides definitions.
Rule M2-10-1 Different identifiers shall be typographically unambiguous.
Rule A2-10-1 An Identifier declared in an inner scope shall not hide an identifier declared in an outer scope.
Rule A2-10-4 The identifier name of a non-member object with static storage duration or static function shall not be reused within a namespace.
Rule A2-10-5 An identifier name of a function with static storage duration or a non-member object with external or internal linkage should not be reused.
Rule A2-10-6 A class or enumeration name shall not be hidden by a variable, function or enumerator declaration in the same scope.
Rule A2-11-1 Volatile keyword shall not be used.
Rule A2-13-1 Only those escape sequences that are defined in ISO/IEC 14882:2014 shall be used.
Rule A2-13-5 Hexadecimal constants should be upper case.
Rule A2-13-6 Universal character names shall be used only inside character or string literals.
Rule M2-13-2 Octal constants (other than zero) and octal escape sequences (other than "\0") shall not be used.
Rule M2-13-3 A "U" suffix shall be applied to all octal or hexadecimal integer literals of unsigned type.
Rule M2-13-4 Literal suffixes shall be upper case.
Rule A2-13-2 String literals with different encoding prefixes shall not be concatenated.
Rule A2-13-3 Type wchar_t shall not be used.
Rule A2-13-4 String literals shall not be assigned to non-constant pointers.
Rule A3-1-1 It shall be possible to include any header file in multiple translation units without violating the One Definition Rule.
Rule A3-1-2 Header files, that are defined locally in the project, shall have a file name extension of one of: ".h", ".hpp" or ".hxx".
Rule A3-1-3 Implementation files, that are defined locally in the project, should have a file name extension of ".cpp".
Rule M3-1-2 Functions shall not be declared at block scope.
Rule A3-1-4 When an array with external linkage is declared, its size shall be stated explicitly.
Rule A3-1-5 Function definition placement in class definition.
Rule A3-1-6 Trivial accessor and mutator functions should be inlined.
Rule M3-2-1 All declarations of an object or function shall have compatible types.
Rule M3-2-2 The One Definition Rule shall not be violated.
Rule M3-2-3 A type, object or function that is used in multiple translation units shall be declared in one and only one file.
Rule M3-2-4 An identifier with external linkage shall have exactly one definition.
Rule A3-3-1 Objects or functions with external linkage shall be declared in a header file.
Rule A3-3-2 Static and thread-local objects shall be constant-initialized.
Rule M3-3-2 If a function has internal linkage then all re-declarations shall include the static storage class specifier.
Rule M3-4-1 An identifier declared to be an object or type shall be defined in a block that minimizes its visibility.
Rule A3-8-1 An object shall not be accessed outside of its lifetime.
Rule M3-9-1 The types used for an object, a function return type, or a function parameter shall be token-for-token identical in all declarations and re-declarations.
Rule A3-9-1 Fixed width integer types from , indicating the size and signedness, shall be used in place of the basic numerical types.
Rule M3-9-3 The underlying bit representations of floating-point values shall not be used.
Rule M4-5-1 Expressions with type bool shall not be used as operands to certain built-in operators.
Rule A4-5-1 Expressions with type enum or enum class shall not be used as operands to built-in and overloaded operators.
Rule M4-5-3 Expressions with type (plain) char and wchar_t shall not be used as operands to certain built-in operators.
Rule A4-7-1 An integer expression shall not lead to data loss.
Rule M4-10-1 NULL shall not be used as an integer value.
Rule A4-10-1 Only nullptr literal shall be used as the null-pointer-constant.
Rule M4-10-2 Literal zero (0) shall not be used as the null-pointer-constant.
Rule A5-0-1 The value of an expression shall be the same under any order of evaluation that the standard permits.
Rule M5-0-2 Limited dependence should be placed on C++ operator precedence rules in expressions.
Rule M5-0-3 A cvalue expression shall not be implicitly converted to a different underlying type.
Rule M5-0-4 An implicit integral conversion shall not change the signedness of the underlying type.
Rule M5-0-5 There shall be no implicit floating-integral conversions.
Rule M5-0-6 An implicit integral or floating-point conversion shall not reduce the size of the underlying type.
Rule M5-0-7 There shall be no explicit floating-integral conversions of a cvalue expression.
Rule M5-0-8 An explicit integral or floating-point conversion shall not increase the size of the underlying type of a cvalue expression.
Rule M5-0-9 An explicit integral conversion shall not change the signedness of the underlying type of a cvalue expression.
Rule M5-0-10 If the bitwise operators ~ and << are applied to an operand with an underlying type of unsigned char or unsigned short, the result shall be immediately cast to the underlying type of the operand.
Rule M5-0-11 The plain char type shall only be used for the storage and use of character values.
Rule M5-0-12 signed char and unsigned char type shall only be used for the storage and use of numeric values.
Rule A5-0-2 The condition of an if-statement and the condition of an iteration statement shall have type bool.
Rule M5-0-14 The first operand of a conditional-operator shall have type bool.
Rule M5-0-15 Array indexing shall be the only form of pointer arithmetic.
Rule M5-0-16 A pointer operand and any pointer resulting from pointer arithmetic using that operand shall both address elements of the same array.
Rule M5-0-17 Subtraction between pointers shall only be applied to pointers that address elements of the same array.
Rule A5-0-4 Pointer arithmetic shall not be used with pointers to non-final classes.
Rule M5-0-18 >, >=, <, <= shall not be applied to objects of pointer type, except where they point to the same array.
Rule A5-0-3 The declaration of objects shall contain no more than two levels of pointer indirection.
Rule M5-0-20 Non-constant operands to a binary bitwise operator shall have the same underlying type.
Rule M5-0-21 Bitwise operators shall only be applied to operands of unsigned underlying type.
Rule A5-1-1 Literal values shall not be used apart from type initialization, otherwise symbolic names shall be used instead.
Rule A5-1-2 Variables shall not be implicitly captured in a lambda expression.
Rule A5-1-3 Parameter list (possibly empty) shall be included in every lambda expression.
Rule A5-1-4 A lambda expression object shall not outlive any of its reference-captured objects.
Rule A5-1-6 Return type of a non-void return type lambda expression should be explicitly specified.
Rule A5-1-7 A lambda shall not be an operand to decltype or typeid.
Rule A5-1-8 Lambda expressions should not be defined inside another lambda expression.
Rule A5-1-9 Identical unnamed lambda expressions shall be replaced with a named function or a named lambda expression.
Rule A5-2-1 dynamic_cast should not be used.
Rule M5-2-2 A pointer to a virtual base class shall only be cast to a pointer to a derived class by means of dynamic_cast.
Rule M5-2-3 Casts from a base class to a derived class should not be performed on polymorphic types.
Rule A5-2-2 Traditional C-style casts shall not be used.
Rule A5-2-3 A cast shall not remove any const or volatile qualification from a pointer or reference.
Rule A5-2-4 reinterpret_cast shall not be used.
Rule A5-2-5 An array or container shall not be accessed beyond its range.
Rule A5-2-6 The operands of a logical && or \\ shall be parenthesized if the operands contain binary operators.
Rule M5-2-6 A cast shall not convert a pointer to a function to any other pointer type, including a pointer to function type.
Rule M5-2-8 An object with integer type or pointer to void type shall not be converted to an object with pointer type.
Rule M5-2-9 A cast should not convert a pointer type to an integral type.
Rule M5-2-10 The increment (++) and decrement (--) operators should not be mixed with other operators in an expression.
Rule M5-2-11 The comma operator, && operator and the || operator shall not be overloaded.
Rule M5-2-12 An identifier with array type passed as a function argument shall not decay to a pointer.
Rule A5-3-1 Evaluation of the operand to the typeid operator shall not contain side effects.
Rule M5-3-1 Each operand of the ! operator, the logical && or the logical || operators shall have type bool.
Rule A5-3-2 Null pointers shall not be dereferenced.
Rule A5-3-3 Pointers to incomplete class types shall not be deleted.
Rule M5-3-2 The unary minus operator shall not be applied to an expression whose underlying type is unsigned.
Rule M5-3-3 The unary & operator shall not be overloaded.
Rule M5-3-4 Evaluation of the operand to the sizeof operator shall not contain side effects.
Rule A5-5-1 A pointer to member shall not access non-existent class members.
Rule A5-6-1 The right hand operand of the integer division or remainder operators shall not be equal to zero.
Rule M5-8-1 The right hand operand of a shift operator shall lie between zero and one less than the width in bits of the underlying type of the left hand operand.
Rule A5-10-1 A pointer to member virtual function shall only be tested for equality with null-pointer-constant.
Rule M5-14-1 The right hand operand of a logical && or || operator shall not contain side effects.
Rule A5-16-1 The ternary conditional operator shall not be used as a sub-expression.
Rule M5-17-1 The semantic equivalence between a binary operator and its assignment operator form shall be preserved.
Rule M5-18-1 The comma operator shall not be used.
Rule M5-19-1 Evaluation of constant unsigned integer expressions should not lead to wrap-around.
Rule M6-2-1 Assignment operators shall not be used in sub-expressions.
Rule A6-2-1Move and copy assignment operators shall either move or respectively copy base classes and data members of a class, without any side effects.
Rule A6-2-2Expression statements shall not be explicit calls to constructors of temporary objects only.
Rule M6-2-2Floating-point expressions shall not be directly or indirectly tested for equality or inequality.
Rule M6-2-3Before preprocessing, a null statement shall only occur on a line by itself; it may be followed by a comment, provided that the first character following the null statement is a white-space character.
Rule M6-3-1The statement forming the body of a switch, while, do ... while or for statement shall be a compound statement.
Rule M6-4-1An if ( condition ) construct shall be followed by a compound statement. The else keyword shall be followed by either a compound statement, or another if statement.
Rule M6-4-2All if ... else if constructs shall be terminated with an else clause.
Rule M6-4-3A switch statement shall be a well-formed switch statement.
Rule M6-4-4A switch-label shall only be used when the most closely-enclosing compound statement is the body of a switch statement.
Rule M6-4-5An unconditional throw or break statement shall terminate every non-empty switch-clause.
Rule M6-4-6The final clause of a switch statement shall be the default-clause.
Rule M6-4-7The condition of a switch statement shall not have bool type.
Rule A6-4-1A switch statement shall have at least two case-clauses, distinct from the default label.
Rule A6-5-1A for-loop that loops through all elements of the container and does not use its loop-counter shall not be used.
Rule A6-5-2A for loop shall contain a single loop-counter which shall not have floating-point type.
Rule M6-5-2If loop-counter is not modified by -- or ++, then, within condition, the loop-counter shall only be used as an operand to <=, <,> or >=.
Rule M6-5-3The loop-counter shall not be modified within condition or statement.
Rule M6-5-4The loop-counter shall be modified by one of --, ++, -=n, or +=n; where n remains constant for the duration of the loop.
Rule M6-5-5A loop-control-variable other than the loop-counter shall not be modified within condition or expression.
Rule M6-5-6A loop-control-variable other than the loop-counter which is modified in statement shall have type bool.
Rule A6-5-3Do statements should not be used.
Rule A6-5-4For-init-statement and expression should not perform actions other than loop-counter initialization and modification.
Rule A6-6-1The goto statement shall not be used.
Rule M6-6-1Any label referenced by a goto statement shall be declared in the same block, or in a block enclosing the goto statement.
Rule M6-6-2The goto statement shall jump to a label declared later in the same function body.
Rule M6-6-3The continue statement shall only be used within a well-formed for loop.
Rule A7-1-1Constexpr or const specifiers shall be used for immutable data declaration.
Rule A7-1-2The constexpr specifier shall be used for values that can be determined at compile time.
Rule M7-1-2A pointer or reference parameter in a function shall be declared as pointer to const or reference to const if the corresponding object is not modified.
Rule A7-1-3CV-qualifiers shall be placed on the right hand side of the type that is a typedef or a using name.
Rule A7-1-4The register keyword shall not be used.
Rule A7-1-5Restictions on use of auto specifier.
Rule A7-1-6The typedef specifier shall not be used.
Rule A7-1-7Each expression statement and identifier declaration shall be placed on a separate line.
Rule A7-1-8A non-type specifier shall be placed before a type specifier in a declaration.
Rule A7-1-9A class, structure, or enumeration shall not be declared in the definition of its type.
Rule A7-2-1An expression with enum underlying type shall only have values corresponding to the enumerators of the enumeration.
Rule A7-2-2Enumeration underlying base type shall be explicitly defined.
Rule A7-2-3Enumerations shall be declared as scoped enum classes.
Rule A7-2-4In an enumeration, either (1) none, (2) the first or (3) all enumerators shall be initialized.
Rule A7-2-5Enumerations should be used to represent sets of related named constants.
Rule M7-3-1The global namespace shall only contain main, namespace declarations and extern "C" declarations.
Rule M7-3-2The identifier main shall not be used for a function other than the global function main.
Rule M7-3-3There shall be no unnamed namespaces in header files.
Rule M7-3-4using-directives shall not be used.
Rule A7-3-1All overloads of a function shall be visible from where it is called.
Rule M7-3-6using-directives and using-declarations (excluding class scope or function scope using-declarations) shall not be used in header files.
Rule A7-4-1The asm declaration shall not be used.
Rule M7-4-1All usage of assembler shall be documented.
Rule M7-4-2Assembler instructions shall only be introduced using the asm declaration.
Rule M7-4-3Assembly language shall be encapsulated and isolated.
Rule M7-5-1A function shall not return a reference or a pointer to an automatic variable (including parameters), defined within the function.
Rule M7-5-2The address of an object with automatic storage shall not be assigned to another object that may persist after the first object has ceased to exist.
Rule A7-5-1A function shall not return a reference or a pointer to a parameter that is passed by reference or const reference.
Rule A7-5-2Functions should not call themselves, either directly or indirectly.
Rule A7-6-1Functions declared with the [[noreturn]] attribute shall not return.
Rule M8-0-1An init-declarator-list or a member-declarator-list shall consist of a single init-declarator or member-declarator respectively.
Rule A8-2-1When declaring function templates, the trailing return type syntax shall be used if the return type depends on the type of parameters.
Rule M8-3-1Parameters in an overriding virtual function shall either use the same default arguments as the function they override, or else shall not specify any default arguments.
Rule A8-4-1Functions shall not be defined using the ellipsis notation.
Rule M8-4-2The identifiers used for the parameters in a re-declaration of a function shall be identical to those in the declaration.
Rule A8-4-2All exit paths from a function with non-void return type shall have an explicit return statement with an expression.
Rule M8-4-4A function identifier shall either be used to call the function or it shall be preceded by a &.
Rule A8-4-3Common ways of passing parameters should be used.
Rule A8-4-4Multiple output values from a function should be returned as a struct or tuple.
Rule A8-4-5"consume" parameters declared as X && shall always be moved from.
Rule A8-4-6"forward" parameters declared as T && shall always be forwarded.
Rule A8-4-7"in" parameters for "cheap to copy" types shall be passed by value.
Rule A8-4-8Output parameters shall not be used.
Rule A8-4-9"in-out" parameters declared as T & shall be modified.
Rule A8-4-10A parameter shall be passed by reference if it can't be NULL.
Rule A8-4-11A smart pointer shall only be used as a parameter type if it expresses lifetime semantics.
Rule A8-4-12std::unique_ptr passed to a function.
Rule A8-4-13std::shared_ptr passed to a function.
Rule A8-4-14Interfaces shall be precisely and strongly typed.
Rule A8-5-0 All memory shall be initialized before it is read.
Rule A8-5-1 Order of initialization in an initialization list.
Rule M8-5-2 Braces shall be used to indicate and match the structure in the non-zero initialization of arrays and structures.
Rule A8-5-2 Braced-initialization {}, without equals sign, shall be used for variable initialization.
Rule A8-5-3 A variable of type auto shall not be initialized using {} or ={} braced-initialization.
Rule A8-5-4 User-declared constructor with parameter of type std::initializer_list.
Rule M9-3-1 const member functions shall not return non-const pointers or references to class-data.
Rule A9-3-1 Member functions shall not return non-const "raw" pointers or references to private or protected data owned by the class.
Rule M9-3-3 If a member function can be made static then it shall be made static, otherwise if it can be made const then it shall be made const.
Rule A9-5-1 Unions shall not be used.
Rule M9-6-1 When the absolute positioning of bits representing a bit-field is required, then the behaviour and packing of bit-fields shall be documented.
Rule A9-6-1 Data types used for interfacing with hardware or conforming to communication protocols shall be trivial, standard-layout and only contain members of types with defined sizes.
Rule A9-6-2 Bit-fields shall be used only when interfacing to hardware or conforming to communication protocols.
Rule M9-6-4 Named bit-fields with signed integer type shall have a length of more than one bit.
Rule A10-0-1Public inheritance shall be used to implement "is-a" relationship.
Rule A10-0-2Membership or non-public inheritance shall be used to implement "has-a" relationship.
Rule A10-1-1Class shall not be derived from more than one base class which is not an interface class.
Rule M10-1-1Classes should not be derived from virtual bases.
Rule M10-1-2A base class shall only be declared virtual if it is used in a diamond hierarchy.
Rule M10-1-3An accessible base class shall not be both virtual and non-virtual in the same hierarchy.
Rule M10-2-1All accessible entity names within a multiple inheritance hierarchy should be unique.
Rule A10-2-1Non-virtual public or protected member functions shall not be redefined in derived classes.
Rule A10-3-1Virtual function declaration shall contain exactly one of the three specifiers: (1) virtual, (2) override, (3) final.
Rule A10-3-2Each overriding virtual function shall be declared with the override or final specifier.
Rule A10-3-3Virtual functions shall not be introduced in a final class.
Rule A10-3-5A user-defined assignment operator shall not be virtual.
Rule M10-3-3A virtual function shall only be overridden by a pure virtual function if it is itself declared as pure virtual.
Rule A10-4-1Hierarchies should be based on interface classes.
Rule M11-0-1Member data in non-POD class types shall be private.
Rule A11-0-1A non-POD type should be defined as class.
Rule A11-0-2Restrictions on struct definitions.
Rule A11-3-1Friend declarations shall not be used.
Rule A12-0-1Special member functions in classes.
Rule A12-0-2Bitwise operations and operations that assume data representation in memory shall not be performed on objects.
Rule M12-1-1An object's dynamic type shall not be used from the body of its constructor or destructor.
Rule A12-1-1Constructors shall explicitly initialize all virtual base classes, all direct non-virtual base classes and all non-static data members.
Rule A12-1-2Both NSDMI and a non-static member initializer in a constructor shall not be used in the same type.
Rule A12-1-3Same member constant initializers in contructors.
Rule A12-1-4All constructors that are callable with a single argument of fundamental type shall be declared explicit.
Rule A12-1-5Common class initialization for non-constant members shall be done by a delegating constructor.
Rule A12-1-6Derived classes that do not need further explicit initialization and require all the constructors from the base class shall use inheriting constructors.
Rule A12-4-1Destructor of a base class shall be public virtual, public override or protected non-virtual.
Rule A12-4-2If a public destructor of a class is non-virtual, then the class should be declared final.
Rule A12-6-1All class data members that are initialized by the constructor shall be initialized using member initializers.
Rule A12-7-1Behavior of a user-defined special member function identical to implicitly defined special member function.
Rule A12-8-1Move and copy constructors shall move and respectively copy base classes and data members of a class, without any side effects.
Rule A12-8-2User-defined copy and move assignment operators should use user-defined no-throw swap function.
Rule A12-8-3Moved-from object shall not be read-accessed.
Rule A12-8-4Move constructor shall not initialize its class members and base classes using copy semantics.
Rule A12-8-5A copy assignment and a move assignment operators shall handle self-assignment.
Rule A12-8-6Copy and move constructors and copy assignment and move assignment operators shall be declared protected or defined "=delete" in base class.
Rule A12-8-7Assignment operators should be declared with the ref-qualifier &.
Rule A13-1-2User defined suffixes of the user defined literal operators shall start with underscore followed by one or more letters.
Rule A13-1-3User defined literals operators shall only perform conversion of passed parameters.
Rule A13-2-1An assignment operator shall return a reference to "this".
Rule A13-2-2A binary arithmetic operator and a bitwise operator shall return a "prvalue".
Rule A13-2-3A relational operator shall return a boolean value.
Rule A13-3-1A function that contains "forwarding reference" as its argument shall not be overloaded.
Rule A13-5-1If "operator[]" is to be overloaded with a non-const version, const version shall also be implemented.
Rule A13-5-2All user-defined conversion operators shall be defined explicit.
Rule A13-5-3User-defined conversion operators should not be used.
Rule A13-5-4If two opposite operators are defined, one shall be defined in terms of the other.
Rule A13-5-5Comparison operators shall be non-member functions with identical parameter types and noexcept.
Rule A13-6-1Digit sequences separators ' usage.
Rule A14-1-1A template should check if a specific template argument is suitable for this template.
Rule A14-5-1A template constructor shall not participate in overload resolution for a single argument of the enclosing class type.
Rule A14-5-2Class members that are not dependent on template class parameters should be defined in a separate base class.
Rule A14-5-3A non-member generic operator shall only be declared in a namespace that does not contain class (struct) type, enum type or union type declarations.
Rule M14-5-3A copy assignment operator shall be declared when there is a template assignment operator with a parameter that is a generic parameter.
Rule M14-6-1In a class template with a dependent base, any name that may be found in that dependent base shall be referred to using a qualified-id or this->
Rule A14-7-1A type used as a template argument shall provide all members that are used by the template.
Rule A14-7-2Template specialization shall be declared in the same file (1) as the primary template (2) as a user-defined type, for which the specialization is declared.
Rule A14-8-2Explicit specializations of function templates shall not be used.
Rule A15-0-1A function shall not exit with an exception if it is able to complete its task.
Rule A15-0-2Basic guarantee for exception safety shall be provided.
Rule A15-0-3Exception safety guarantee of a called function shall be considered.
Rule A15-0-4Unchecked exceptions shall be used to represent errors from which the caller cannot reasonably be expected to recover.
Rule A15-0-5Checked exceptions shall be used to represent errors from which the caller can reasonably be expected to recover.
Rule A15-0-6Analysis of failure modes of exception handling.
Rule A15-0-7Exception handling mechanism shall guarantee a deterministic worst-case time execution time.
Rule A15-0-8A worst-case execution time (WCET) analysis shall be performed to determine maximum execution time constraints of the software, covering in particular the exceptions processing.
Rule A15-1-1Only instances of types derived from std::exception should be thrown.
Rule A15-1-2An exception object shall not be a pointer.
Rule M15-0-3Control shall not be transferred into a try or catch block using a goto or a switch statement.
Rule M15-1-1The assignment-expression of a throw statement shall not itself cause an exception to be thrown.
Rule M15-1-2NULL shall not be thrown explicitly.
Rule M15-1-3An empty throw (throw;) shall only be used in the compound-statement of a catch handler.
Rule A15-1-3All thrown exceptions should be unique.
Rule A15-1-4If a function exits with an exception, then place all objects/resources in valid states.
Rule A15-1-5Exceptions shall not be thrown across execution boundaries.
Rule A15-2-1Constructors that are not noexcept shall not be invoked before program startup.
Rule A15-2-2Behavior of a constructor that is not noexcept and cannot finish object initialization.
Rule M15-3-1Exceptions shall be raised only after start-up and before termination of the program.
Rule A15-3-2If a function throws an exception, it shall be handled when meaningful actions can be taken, otherwise it shall be propagated.
Rule A15-3-3Main function and a task main function shall catch at least certain exceptions.
Rule A15-3-4If a function throws an exception, it shall be handled when meaningful actions can be taken, otherwise it shall be propagated.
Rule M15-3-3Handlers of a function-try-block implementation of a class constructor or destructor shall not reference non-static members from this class or its bases.
Rule M15-3-4Each exception explicitly thrown in the code shall have a handler of a compatible type in all call paths that could lead to that point.
Rule A15-3-5A class type exception shall be caught by reference or const reference.
Rule M15-3-6Where multiple handlers are provided in a single try-catch statement or function-try-block for a derived class and some or all of its bases, the handlers shall be ordered most-derived to base class.
Rule M15-3-7Where multiple handlers are provided in a single try-catch statement or function-try-block, any ellipsis (catch-all) handler shall occur last.
Rule A15-4-1Dynamic exception-specification shall not be used.
Rule A15-4-2If a function is declared to be noexcept then it shall not exit with an exception.
Rule A15-4-3The noexcept specification of a function shall either be identical across all translation units, or identical or more restrictive between a virtual member function and an overrider.
Rule A15-4-4A declaration of non-throwing function shall contain noexcept specification.
Rule A15-4-5Checked exceptions that could be thrown from a function shall be specified together with the function declaration and they shall be identical in all function declarations and for all its overriders.
Rule A15-5-1All user-provided class destructors, deallocation functions, move constructors, move assignment operators and swap functions shall not exit with an exception.
Rule A15-5-2Program shall not be abruptly terminated.
Rule A15-5-3The std::terminate() function shall not be called implicitly.
Rule A16-0-1The pre-processor shall only be used for unconditional and conditional file inclusion and include guards.
Rule M16-0-1#include directives in a file shall only be preceded by other preprocessor directives or comments.
Rule M16-0-2Macros shall only be #define'd or #undef'd in the global namespace.
Rule A16-2-2There shall be no unused include directives.
Rule A16-2-3An include directive shall be added explicitly for every symbol used in a file.
Rule M16-0-5Arguments to a function-like macro shall not contain tokens that look like preprocessing directives.
Rule M16-0-6In the definition of a function-like macro, each instance of a parameter shall be enclosed in parentheses, unless it is used as the operand of # or ##.
Rule M16-0-7Undefined macro identifiers shall not be used in #if or #elif preprocessor directives, except as operands to the defined operator.
Rule M16-0-8If the # token appears as the first token on a line, then it shall be immediately followed by a preprocessing token.
Rule M16-1-1The defined preprocessor operator shall only be used in one of the two standard forms.
Rule M16-1-2All #else, #elif and #endif preprocessor directives shall reside in the same file as the #if or #ifdef directive to which they are related.
Rule M16-2-3Include guards shall be provided.
Rule A16-2-1The ', ", /*, //, \ characters shall not occur in a header file name or in #include directive.
Rule M16-3-1There shall be at most one occurrence of the # or ## operators in a single macro definition.
Rule M16-3-2The # and ## operators should not be used.
Rule A16-6-1#error directive shall not be used.
Rule A16-7-1The #pragma directive shall not be used.
Rule A17-0-1Reserved identifiers, macros and functions in the C++ standard library shall not be defined, redefined or undefined.
Rule M17-0-2The names of standard library macros and objects shall not be reused.
Rule M17-0-3The names of standard library functions shall not be overridden.
Rule A17-0-2All project's code including used libraries and any third-party user code shall conform to the AUTOSAR C++14 Coding Guidelines.
Rule M17-0-5The setjmp macro and the longjmp function shall not be used.
Rule A17-1-1Use of the C Standard Library shall be encapsulated and isolated.
Rule A17-6-1Non-standard entities shall not be added to standard namespaces.
Rule A18-0-1The C library facilities shall only be accessed through C++ library headers.
Rule A18-0-2The error state of a conversion from string to a numeric value shall be checked.
Rule M18-0-3The library functions abort, exit, getenv and system from library shall not be used.
Rule M18-0-4The time handling functions of library shall not be used.
Rule M18-0-5The unbounded functions of library shall not be used.
Rule A18-0-3The library (locale.h) and the setlocale function shall not be used.
Rule A18-1-1C-style arrays shall not be used.
Rule A18-1-2The std::vector specialization shall not be used.
Rule A18-1-3The std::auto_ptr type shall not be used.
Rule A18-1-4A pointer pointing to an element of an array of objects shall not be passed to a smart pointer of single object type.
Rule A18-1-6All std::hash specializations for user-defined types shall have a noexcept function call operator.
Rule M18-2-1The macro offsetof shall not be used.
Rule A18-5-1Functions malloc, calloc, realloc and free shall not be used.
Rule A18-5-2Non-placement new or delete expressions shall not be used.
Rule A18-5-3The form of the delete expression shall match the form of the new expression used to allocate the memory.
Rule A18-5-4If a project has sized or unsized version of operator "delete" globally defined, then both sized and unsized versions shall be defined.
Rule A18-5-5Criteria for memory management functions.
Rule A18-5-6An analysis shall be performed to analyze the failure modes of dynamic memory management.
Rule A18-5-7Non-realtime implementation of dynamic memory management.
Rule A18-5-8 Objects that do not outlive a function shall have automatic storage duration.
Rule A18-5-9 Custom implementations of dynamic memory allocation and deallocation functions.
Rule A18-5-10Placement new shall be used only with properly aligned pointers to sufficient storage capacity.
Rule A18-5-11"operator new" and "operator delete" shall be defined together.
Rule M18-7-1 The signal handling facilities of shall not be used.
Rule A18-9-1 The std::bind shall not be used.
Rule A18-9-2 Forwarding values to other functions.
Rule A18-9-3 The std::move shall not be used on objects declared const or const&.
Rule A18-9-4 An argument to std::forward shall not be subsequently used.
Rule M19-3-1 The error indicator errno shall not be used.
Rule A20-8-1 An already-owned pointer value shall not be stored in an unrelated smart pointer.
Rule A20-8-2 A std::unique_ptr shall be used to represent exclusive ownership.
Rule A20-8-3 A std::shared_ptr shall be used to represent shared ownership.
Rule A20-8-4 A std::unique_ptr shall be used over std::shared_ptr if ownership sharing is not required.
Rule A20-8-5 std::make_unique shall be used to construct objects owned by std::unique_ptr.
Rule A20-8-6 std::make_shared shall be used to construct objects owned by std::shared_ptr.
Rule A20-8-7 A std::weak_ptr shall be used to represent temporary shared ownership.
Rule A21-8-1 Arguments to character-handling functions shall be representable as an unsigned char.
Rule A23-0-1 An iterator shall not be implicitly converted to const_iterator.
Rule A23-0-2 Elements of a container shall only be accessed via valid references, iterators, and pointers.
Rule A25-1-1 Non-static data members or captured values of predicate function objects.
Rule A25-4-1 Ordering predicates used with associative containers and STL sorting and related algorithms shall adhere to a strict weak ordering relation.
Rule A26-5-1 Pseudorandom numbers shall not be generated using std::rand().
Rule A26-5-2 Random number engines shall not be default-initialized.
Rule M27-0-1 The stream input/output library shall not be used.
Rule A27-0-1 Inputs from independent components shall be validated.
Rule A27-0-2 A C-style string shall guarantee sufficient space for data and the null terminator.
Rule A27-0-3 Alternate input and output operations on a file stream shall not be used without an intervening flush or positioning call.
Rule A27-0-4 C-style strings shall not be used.