Image Blog QAC High Integrity CPP
October 8, 2020

What Is the High Integrity C++ (HIC++) Coding Standard?

Security & Compliance
Static Analysis

High Integrity C++ (HIC++) is a coding standard developed by Perforce (formerly PRQA).

HIC++ helps developers write high quality, maintainable, portable, and robust code in modern C++ (C++11). Development teams in many industries use HIC++.

The latest version — version 4.0 — was published on October 3, 2013.

Back to top

What Does the High Integrity C++ Coding Standard Cover?

The High Integrity C++ coding standard includes best practices for developing high-quality software. It specifies coding rules and gives examples of compliant and non-compliant code.

HIC++ Coding Rules

There are 155 coding rules in HIC++. The following are some of the most popular coding rules.


Do not pass std::unique_ptr by const reference

Rule 8.2.4 follows the advice of Herb Sutter. Passing by non-const reference signifies that the parameter is an in/out parameter. Passing by value signifies that the parameter is a sink (i.e. takes ownership and does not return it).


Ensure that a function argument does not undergo an array-to-pointer conversion

Rule 4.1.1 originates from the JSF AV C++ coding standard.

The issue arises because a function parameter that looks like an array is actually just a pointer:


void f1(int a[10]) { // Equivalent to void f1(int*)
    a[8] = 0;        // Out of Bounds when called from f2
void f2() {
    int b[5];
    f1(b);                // Not illegal code!


You may assume that the array dimension in f1 is checked by the compiler. But no checking will take place. In JSF C++, the passing of array arguments isn’t allowed.

HIC++, however, allows arrays to be passed as arguments. But this is only when the dimension information is not lost:


void f1(int (&a)[10]) { // Parameter is reference to
                                // array of 10 elements.
   a[8] = 0;              // Guaranteed to be legal
void f2() {
    int b[5];
    f1(b);                // Illegal - Compile Error
                             // Cannot convert int[5] to int[10]



Do not use tab characters in source files

Indenting code with spaces ensures that formatting is preserved when printing and across different editors or tools.


Use an atomic, non-throwing swap operation to implement the copy and move assignment operators

Rule 12.5.6 ensures the correct copying and moving of a class. And it provides strong exception safety.

This provides a simple and consistent way to layout members in a class, for example:


class A {
    A (A const &) …
    A (A &&) …
    A & operator=(A rhs) & noexcept {
            swap (*this, rhs);
            return *this;



Do not use digraphs or trigraphs

Rule 2.2.2 prevents the use of digraphs and trigraphs. Trigraphs, in particular, do not behave well with raw string literals in C++11.


Back to top

How to Use HIC++

The best way to comply with the HIC++ coding standard is to use a static code analyzer.

Helix QAC offers the greatest accuracy in complying with HIC++ rules.

Helix QAC also provides:

  • Fully documented rule enforcement and message interpretation
  • Supplied with extensive example code
  • Fully configurable rules processing
  • Compliance reports for functional safety audits

Request My Trial

Back to top