add cmake config option to enable clang-tidy with preferred options

This commit is contained in:
Axel Kohlmeyer
2021-05-16 16:10:33 -04:00
parent 32838fd4b8
commit cfb3efb50f
4 changed files with 52 additions and 21 deletions

View File

@ -104,6 +104,12 @@ endif()
option(BUILD_TOOLS "Build and install LAMMPS tools (msi2lmp, binary2txt, chain)" OFF)
option(BUILD_LAMMPS_SHELL "Build and install the LAMMPS shell" OFF)
# allow enabling clang-tidy for C++ files
set(ENABLE_CLANG_TIDY OFF CACHE BOOL "Include clang-tidy processing when compiling")
if(ENABLE_CLANG_TIDY)
set(CMAKE_CXX_CLANG_TIDY "clang-tidy;-checks=*-header-filter=.*" CACHE LIST "")
endif()
include(GNUInstallDirs)
file(GLOB ALL_SOURCES ${LAMMPS_SOURCE_DIR}/[^.]*.cpp)
file(GLOB MAIN_SOURCES ${LAMMPS_SOURCE_DIR}/main.cpp)

View File

@ -28,6 +28,28 @@ variable VERBOSE set to 1:
----------
.. _clang-tidy
Enable static code analysis with clang-tidy
-------------------------------------------
The `clang-tidy tool <https://clang.llvm.org/extra/clang-tidy/>`_ is a
static code analysis tool to diagnose (and potentially fix) typical
programming errors or coding style violations. It has a modular framework
of tests that can be adjusted to help identifying problems before they
become bugs and also assist in modernizing large code bases (like LAMMPS).
It can be enabled for all C++ code with the following CMake flag
.. code-block:: bash
-D ENABLE_CLANG_TIDY=value # value = no (default) or yes
With this flag enabled all source files will be processed twice, first to
be compiled and then to be analyzed. Please note that the analysis can be
significantly more time consuming than the compilation itself.
----------
.. _iwyu_processing:
Report missing and unneeded '#include' statements

View File

@ -1,4 +1,3 @@
// clang-format off
/* ----------------------------------------------------------------------
LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator
https://lammps.sandia.gov/, Sandia National Laboratories
@ -14,8 +13,8 @@
#include "arg_info.h"
#include <stdexcept>
#include <cstring>
#include <stdexcept>
using namespace LAMMPS_NS;
@ -29,46 +28,51 @@ using namespace LAMMPS_NS;
* \param arg string with possible reference
* \param allowed integer with bitmap of allowed types of references */
ArgInfo::ArgInfo(const std::string &arg, int allowed)
: type(NONE), dim(0), index1(-1), index2(-1)
ArgInfo::ArgInfo(const std::string &arg, int allowed) : type(NONE), dim(0), index1(-1), index2(-1)
{
if ((arg.size() > 2) && (arg[1] == '_')) {
if ((arg[0] == 'c') && (allowed & COMPUTE)) type = COMPUTE;
else if ((arg[0] == 'f') && (allowed & FIX)) type = FIX;
else if ((arg[0] == 'v') && (allowed & VARIABLE)) type = VARIABLE;
else if ((arg[0] == 'd') && (allowed & DNAME)) type = DNAME;
else if ((arg[0] == 'i') && (allowed & INAME)) type = INAME;
if ((arg[0] == 'c') && (allowed & COMPUTE))
type = COMPUTE;
else if ((arg[0] == 'f') && (allowed & FIX))
type = FIX;
else if ((arg[0] == 'v') && (allowed & VARIABLE))
type = VARIABLE;
else if ((arg[0] == 'd') && (allowed & DNAME))
type = DNAME;
else if ((arg[0] == 'i') && (allowed & INAME))
type = INAME;
else {
index1 = 0;
name = arg;
return;
}
std::size_t has_idx1 = arg.find('[',2);
std::size_t has_idx1 = arg.find('[', 2);
if (has_idx1 != std::string::npos) {
name = arg.substr(2,has_idx1-2);
name = arg.substr(2, has_idx1 - 2);
dim = 1;
std::size_t has_idx2 = arg.find('[',has_idx1+1);
std::size_t has_idx2 = arg.find('[', has_idx1 + 1);
if (has_idx2 != std::string::npos) {
dim = 2;
if (arg[arg.size()-1] != ']') {
if (arg[arg.size() - 1] != ']') {
type = UNKNOWN;
} else {
try {
index2 = std::stoi(arg.substr(has_idx2+1,arg.size()-(has_idx2+2)));
index2 = std::stoi(arg.substr(has_idx2 + 1, arg.size() - (has_idx2 + 2)));
} catch (std::invalid_argument &) {
type = UNKNOWN;
}
}
} else has_idx2 = arg.size();
} else
has_idx2 = arg.size();
if (arg[has_idx2-1] != ']') {
if (arg[has_idx2 - 1] != ']') {
type = UNKNOWN;
} else {
try {
index1 = std::stoi(arg.substr(has_idx1+1,arg.size()-(has_idx2+2)));
index1 = std::stoi(arg.substr(has_idx1 + 1, arg.size() - (has_idx2 + 2)));
} catch (std::invalid_argument &) {
type = UNKNOWN;
}
@ -97,8 +101,7 @@ ArgInfo::ArgInfo(const std::string &arg, int allowed)
char *ArgInfo::copy_name()
{
char *dest = new char[name.size()+1];
strcpy(dest,name.c_str());
char *dest = new char[name.size() + 1];
strcpy(dest, name.c_str()); // NOLINT
return dest;
}

View File

@ -638,7 +638,7 @@ int utils::expand_args(const char *file, int line, int narg, char **arg, int mod
char *utils::strdup(const std::string &text)
{
char *tmp = new char[text.size() + 1];
strcpy(tmp, text.c_str());
strcpy(tmp, text.c_str()); // NOLINT
return tmp;
}