.. title:: clang-tidy - cppcoreguidelines-pro-bounds-avoid-unchecked-container-access

cppcoreguidelines-pro-bounds-avoid-unchecked-container-access
=============================================================

Finds calls to ``operator[]`` in STL containers and suggests replacing them
with safe alternatives.
Safe alternatives include STL ``at`` or GSL ``at`` functions, ``begin()`` or
``end()`` functions, ``range-for`` loops, ``std::span``, or an appropriate
function from ``<algorithms>``.

For example, both

.. code-block:: c++

  std::vector<int> a;
  int b = a[4];

and

.. code-block:: c++

  std::unique_ptr<vector> a;
  int b = a[0];

will generate a warning.

STL containers for which ``operator[]`` is well-defined for all inputs are
excluded from this check (e.g.: ``std::map::operator[]``).

This check enforces part of the `SL.con.3
<https://isocpp.github.io/CppCoreGuidelines/CppCoreGuidelines#slcon3-avoid-bounds-errors>`_
guideline and is part of the `Bounds Safety (Bounds 4)
<https://isocpp.github.io/CppCoreGuidelines/CppCoreGuidelines#pro-bounds-arrayindex>`_
profile from the C++ Core Guidelines.

Options
-------

.. option:: ExcludeClasses

    Semicolon-separated list of regular expressions matching class names that
    overwrites the default exclusion list. The default is:
    `::std::map;::std::unordered_map;::std::flat_map`.

.. option:: FixMode

    Determines what fixes are suggested. Either `none`, `at` (use
    ``a.at(index)`` if a fitting function exists) or `function` (use a
    function ``f(a, index)``). The default is `none`.

.. option:: FixFunction

    The function to use in the `function` mode. For C++23 and beyond, the
    passed function must support the empty subscript operator, i.e., the case
    where ``a[]`` becomes ``f(a)``. :option:`FixFunctionEmptyArgs` can be
    used to override the suggested function in that case. The default is `gsl::at`.

.. option:: FixFunctionEmptyArgs

    The function to use in the `function` mode for the empty subscript operator
    case in C++23 and beyond only. If no fixes should be made for empty
    subscript operators, pass an empty string. In that case, only the warnings
    will be printed. The default is the value of :option:`FixFunction`.
