Анализатор обнаружил ситуацию, в которой производится попытка обхода пустого контейнера. В результате не произойдет ни одной итерации цикла, что может свидетельствовать об ошибке.
Рассмотрим следующий пример, который может возникнуть вследствие неудачного рефакторинга:
#include <vector> #include <string_view> std::vector<std::string_view> GetSystemPaths() { std::vector<std::string_view> paths; #ifdef _WIN32 paths.emplace_back("C:/Program files (x86)/Windows Kits"); paths.emplace_back("C:/Program Files (x86)/Microsoft Visual Studio"); #elif defined(__APPLE__) paths.emplace_back("/Applications"); paths.emplace_back("/Library"); paths.emplace_back("/usr/local/Cellar"); #elif defined(__linux__) // TODO: Don't forget to add some specific paths #endif return paths; } bool IsSystemPath(std::string_view path) { static const auto system_paths = GetSystemPaths(); for (std::string_view system_path : system_paths) { if (system_path == path) { return true; } } return false; }
Наполнение контейнера 'system_paths' зависит от операционной системы, под которую компилируется приложение. Для операционной системы семейства Linux и всех остальных, кроме Windows и macOS, в результате раскрытия директив препроцессора будет получен пустой контейнер.
В контексте этого примера это нежелательное поведение функции 'GetSystemPaths'. В случае с Linux, для исправления предупреждения, нужно добавить необходимые пути. При компиляции на новую операционную систему (например, FreeBSD) разработчику, возможно, стоит выдать ошибку при помощи static_assert. Возможное исправление кода:
#include <vector> #include <string_view> std::vector<std::string_view> GetSystemPaths() { std::vector<std::string_view> paths; #ifdef _WIN32 .... #elif defined(__APPLE__) .... #elif defined(__linux__) paths.emplace_back("/usr/include/"); paths.emplace_back("/usr/local/include"); #else static_assert(false, "Unsupported OS."); #endif return paths; }
В общем случае, если итерирование пустого контейнера было специально задумано программистом, то предупреждение можно подавить.