| Issue |
179094
|
| Summary |
[clang-tidy] `clang-analyzer-optin.core.EnumCastOutOfRange` warns about inline functions in system headers
|
| Labels |
clang-tidy
|
| Assignees |
|
| Reporter |
tearfur
|
clang-tidy shouldn't warn about system headers without `--system-headers`, but I had multiple instances of `clang-analyzer-optin.core.EnumCastOutOfRange` warning about inline functions in system headers.
I don't know how I can demonstrate this in godbolt, so I'm just going to give examples on where this happens.
- Using `operator|` on [`Gtk::TreeModel::Flags`](https://gnome.pages.gitlab.gnome.org/gtkmm/group__gtkmmEnums.html#ga7a86e009cc39c176e1966fa00a74d861) from gtkmm 4.20. Runing clang-tidy 21.1.8.
I've checked the compiler command that it specifies `-isystem /usr/include/gtkmm-4.0`.
Example code:
```c++
Gtk::TreeModel::Flags::ITERS_PERSIST | Gtk::TreeModel::Flags::LIST_ONLY;
```
Example clang-tidy output:
```
/usr/include/gtkmm-4.0/gtkmm/treemodel.h:761:12: warning: The value '3' provided to the cast _expression_ is not in the valid range of values for 'Flags' [clang-analyzer-optin.core.EnumCastOutOfRange]
761 | { return static_cast<TreeModel::Flags>(static_cast<unsigned>(lhs) | static_cast<unsigned>(rhs)); }
| ^
/usr/include/gtkmm-4.0/gtkmm/treemodel.h:219:14: note: enum declared here
219 | enum class Flags
| ~~~~~~~~~~~^~~~~
220 | {
| ~
221 | ITERS_PERSIST = 1 << 0,
| ~~~~~~~~~~~~~~~~~~~~~~~
222 | LIST_ONLY = 1 << 1
| ~~~~~~~~~~~~~~~~~~
223 | };
| ~
/transmission/gtk/ListModelAdapter.cc:64:12: note: Calling 'operator|'
64 | return TR_GTK_TREE_MODEL_FLAGS(ITERS_PERSIST) | TR_GTK_TREE_MODEL_FLAGS(LIST_ONLY);
| ^
/transmission/gtk/GtkCompat.h:76:49: note: expanded from macro 'TR_GTK_TREE_MODEL_FLAGS'
76 | #define TR_GTK_TREE_MODEL_FLAGS(Code) IF_GTKMM4(Gtk::TreeModel::Flags::Code, Gtk::TREE_MODEL_##Code)
| ^
/transmission/gtk/GtkCompat.h:42:41: note: expanded from macro 'IF_GTKMM4'
42 | #define IF_GTKMM4(ThenValue, ElseValue) ThenValue
| ^
```
- Using the non-throw variant of `std::filesystem::last_write_time()` on Visual Studio 2022. Running clang-tidy 20.1.8.
Example output:
```
C:\Program Files\Microsoft Visual Studio\2022\Enterprise\VC\Tools\MSVC\14.44.35207\include\xfilesystem_abi.h:132:1: warning: The value '33' provided to the cast _expression_ is not in the valid range of values for '__std_fs_stats_flags' [clang-analyzer-optin.core.EnumCastOutOfRange]
132 | _BITMASK_OPS(_EMPTY_ARGUMENT, __std_fs_stats_flags)
| ^
C:\Program Files\Microsoft Visual Studio\2022\Enterprise\VC\Tools\MSVC\14.44.35207\include\type_traits:2212:16: note: expanded from macro '_BITMASK_OPS'
2212 | return static_cast<_BITMASK>(static_cast<_IntTy>(_Left) | static_cast<_IntTy>(_Right)); \
| ^
C:\Program Files\Microsoft Visual Studio\2022\Enterprise\VC\Tools\MSVC\14.44.35207\include\xfilesystem_abi.h:117:12: note: enum declared here
117 | enum class __std_fs_stats_flags : unsigned long {
| ~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
118 | _None = 0,
| ~~~~~~~~~~
119 |
120 | _Follow_symlinks = 0x01, // resolve symlink
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
121 | _Attributes = 0x02, // read/has attributes
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
122 | _Reparse_tag = 0x04, // read/has reparse_tag; may not be combined with _Follow_symlinks
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
123 | _File_size = 0x08, // read/has file size
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
124 | _Link_count = 0x10, // read/has link count
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
125 | _Last_write_time = 0x20, // read/has last write time
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
126 |
127 | _All_data = _Attributes | _Reparse_tag | _File_size | _Link_count | _Last_write_time
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
128 | };
| ~
D:\a\transmission\transmission\src\libtransmission\file.cc:251:27: note: Calling 'tr_sys_path_get_info'
251 | if (auto const info = tr_sys_path_get_info(folder); !info || !info->isFolder())
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~
D:\a\transmission\transmission\src\libtransmission\file.cc:86:25: note: '?' condition is false
86 | auto const status = (flags & TR_SYS_PATH_NO_FOLLOW) != 0 ? std::filesystem::symlink_status(filesystem_path, ec) :
| ^
D:\a\transmission\transmission\src\libtransmission\file.cc:89:9: note: Left side of '||' is false
89 | if (ec || status.type() == std::filesystem::file_type::not_found)
| ^
D:\a\transmission\transmission\src\libtransmission\file.cc:89:5: note: Taking false branch
89 | if (ec || status.type() == std::filesystem::file_type::not_found)
| ^
D:\a\transmission\transmission\src\libtransmission\file.cc:97:5: note: Taking false branch
97 | if (std::filesystem::is_regular_file(status))
| ^
D:\a\transmission\transmission\src\libtransmission\file.cc:107:10: note: Taking false branch
107 | else if (std::filesystem::is_directory(status))
| ^
D:\a\transmission\transmission\src\libtransmission\file.cc:118:24: note: Calling 'last_write_time'
118 | auto const ftime = std::filesystem::last_write_time(filesystem_path, ec);
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
C:\Program Files\Microsoft Visual Studio\2022\Enterprise\VC\Tools\MSVC\14.44.35207\include\filesystem:3966:24: note: Calling '_Last_write_time'
3966 | _Ec = _Make_ec(_Last_write_time(_Path, _Result));
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
C:\Program Files\Microsoft Visual Studio\2022\Enterprise\VC\Tools\MSVC\14.44.35207\include\filesystem:3944:37: note: Calling 'operator|'
3944 | _Path.c_str(), &_Stats, __std_fs_stats_flags::_Follow_symlinks | __std_fs_stats_flags::_Last_write_time);
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
```
_______________________________________________
llvm-bugs mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-bugs