exponenta event banner

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

Должна использоваться каждая функция, определенная в анонимном пространстве имен, или статическая функция с внутренней связью, или частная функция-член.

Описание

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

Должна использоваться каждая функция, определенная в анонимном пространстве имен, или статическая функция с внутренней связью, или частная функция-член.

Объяснение

Функции, определенные в анонимном пространстве имен, и статические функции с внутренней связью вызываются только внутри блока компиляции, в котором они определены. Аналогично, частные функции-члены вызываются только внутри реализации класса, к которой они принадлежат. В обоих случаях такие функции предназначены для использования исключительно в текущем исходном коде, а не во внешнем коде, который в дальнейшем будет интегрирован в проект. Неиспользование таких функций указывает на плохую конструкцию программного обеспечения или отсутствие логики в текущей кодовой базе.

Примечание

Явного вызова функции в исходном коде достаточно для выполнения этого правила, даже если вызов недоступен во время выполнения. Отдельное правило, M0-1-1, проверяет все недоступные вхождения кода.

Внедрение Polyspace

Если функция, определенная в исходном коде, не вызывается явным образом и относится к одной из следующих категорий, средство проверки помечает определение функции:

  • Функции, определенные в анонимном пространстве имен

  • Статические функции с внутренней связью

  • Частные функции-члены, определенные вне определения класса

Средство проверки не помечает неподсвоенную частную функцию-член, определенную в определении класса.

Средство проверки не помечает частные функции-члены, определенные вне определения класса в анализе Polyspace ® по умолчанию в качестве кода. См. раздел Шашки, деактивированные в Polyspace как анализ кода по умолчанию (Polyspace Bug Finder Access).

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

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

Примеры

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

#include <cstdint>

namespace
{
  void F1()   // Compliant, function in anonymous namespace used
  {
  }
  
  void F2()   // Noncompliant, function in anonymous namespace not used
  {
  }
}

int main()
{
  F1();
  return 0;
}

Статическая функция F2 определяется в анонимном пространстве имен, но не вызывается из основной функции, тем самым нарушая это правило кодирования.

#include <cstdint>
static void F1() // Compliant, static function called from main
{
}

static void F2() // Noncompliant, static function not called from main
{
}

int main()
{
  F1();
  return 0;
}

Статическая функция F2 имеет внутреннюю связь, но не вызывается из основной функции, тем самым нарушая это правило кодирования.

#include <cstdint>

class C
{
  public:
    C() : x(0) {}
    void M1(std::int32_t);                
    void M2(std::int32_t, std::int32_t);  
  private:
    std::int32_t x;
    void M1PrivateImpl(std::int32_t j);    
};

// Compliant, member function is used
void C::M1(std::int32_t i)   
{
  x = i;
}

// Compliant, never used but declared as public
void C::M2(std::int32_t i, std::int32_t j)     
{
  x = (i > j) ? i : j;
}

void C::M1PrivateImpl(std::int32_t j) // Noncompliant, private member function never used
{
  x = j;
}

int main()
{
  C c;
  c.M1(1);
  return 0;
}

Частная функция-член M1PrivateImpl не вызывается ни от одного члена класса C, тем самым нарушая это правило кодирования.

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

Группа: Вопросы, не зависящие от языка
Категория: Обязательно, Автоматизировано
Представлен в R2020b