Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Consider adding a test with /analyze:plugin EspXEngine.dll #2094

Open
AlexGuteniev opened this issue Aug 5, 2021 · 6 comments
Open

Consider adding a test with /analyze:plugin EspXEngine.dll #2094

AlexGuteniev opened this issue Aug 5, 2021 · 6 comments
Labels
test Related to test code

Comments

@AlexGuteniev
Copy link
Contributor

There's already /analyze option:

-DCMAKE_CXX_FLAGS=/analyze:autolog- ^

/analyze:plugin EspXEngine.dll could be added to add C++ Core Guidelines check.
See more: Use the C++ Core Guidelines checkers

As an example #2069 changes can be enforced: https://godbolt.org/z/jfx9dzb1T

It may produce too many warnings that won't b addressed though. These can be suppressed either by ordinary suppression or by [[gsl::suppress(...)]] attribute.

@CaseyCarter CaseyCarter added decision needed We need to choose something before working on this enhancement Something can be improved build Related to the build system and removed enhancement Something can be improved labels Aug 5, 2021
@CaseyCarter
Copy link
Contributor

My gut reaction is that the resulting signal-to-noise ratio would be extremely low and that this wouldn't be worthwhile. That said, I wouldn't mind someone doing the investigation to determine if there's a reasonable compromise subset of the Core Guidelines checkers that we could enable without spamming suppression fluff everywhere. (I suspect that, e.g., "Use span instead of pointer arithmetic" would need to be suppressed globally.)

@AlexGuteniev
Copy link
Contributor Author

Possibly it can be done like this:

#pragma warning(disable: ALL_CPPCORECHECK_WARNINGS)
#pragma warning(default: 26433 26435 ...)

@StephanTLavavej StephanTLavavej changed the title build: consider /analyze:plugin EspXEngine.dll for CI builds Consider adding a test with /analyze:plugin EspXEngine.dll Aug 11, 2021
@StephanTLavavej StephanTLavavej added test Related to test code and removed decision needed We need to choose something before working on this build Related to the build system labels Aug 11, 2021
@StephanTLavavej
Copy link
Member

We talked about this in our weekly maintainer meeting - we think that adding an "include all headers" test, covering specific CppCoreCheck warnings (as you mentioned immediately above), could be useful. As I mentioned in Discord, the STL's build is less useful to provide such coverage as it compiles only a fraction of the STL (primarily iostreams/filesystem/multithreading).

We definitely don't want to adopt all C++ Core Guidelines for this codebase, so we'll need to select exactly which warnings to enable. Starting with the "avoid redundant virtual when we have override" convention seems great.

@diablodale
Copy link

...yes and... the sideaffect of this STL codebase when used on MSVC (vs2022) code analyzer generates a LOT of noise in very simple programs. A 29 line c++ program that includes cstdint, optional and stdexcept results in 67 lines of warnings all from this STL. Naturally that level of warnings overwhelms useful diagnostics from the compiler. The warnings are all from MSVC analyzer's warning C26xxx range.

A partnership between STL and MSVC is likely needed to consider how to resolve the excessive noise.

  • There is no warning level for analyzer warnings so they can not be excluded with the /external:Wx flag
  • The STL is all-about-templates (as are all modern c++ programs) so /external:templates-must be used so to have coverage in a program's STL usage as well as all other external/3rd party libraries.
#include <cstdint>
#include <optional>
#include <stdexcept>

int gds = 7;
int sdi = 2;
bool array1[5] = { true, false, true, false, true };

void bugrepro(std::optional<int32_t> candidate = std::nullopt);

void bugrepro(std::optional<int32_t> candidate) {
    if (candidate.has_value()) {
        if (candidate < 0 || candidate > gds)
            throw std::out_of_range("bad value");
    }
    else {
        if (sdi <= 0)
            return;
        candidate = sdi;
    }

    if (!array1[candidate.value()]) {
        throw std::runtime_error("no good");
    }
}

int main() {
    bugrepro();
}

compiled with

C:\\PROGRA~1\\MIB055~1\\2022\\COMMUN~1\\VC\\Tools\\MSVC\\1436~1.325\\bin\\Hostx64\\x64\\cl.exe  /nologo /TP /DWIN32 /D_WINDOWS /EHsc /Ob0 /Od /RTC1 -std:c++17 -MDd -Zi /W4 /analyze:plugin EspXEngine.dll /wd26446 /wd26482 /external:anglebrackets /external:W3 /analyze:external- /external:templates- /FoCMakeFiles\\bug4.dir\\main.cpp.obj /FdTARGET_COMPILE_PDB /FS -c C:\\repos-nobackup\\vs-bug4\\main.cpp

results in

[main] Building folder: vs-bug4 clean
[build] Starting build
[proc] Executing command: "C:\Program Files\CMake\bin\cmake.exe" --build c:/repos-nobackup/vs-bug4/build --config Debug --target clean -j 14 --
[build] [1/1 100% :: 0.018] Cleaning all built files...
[build] Cleaning... 1 files.
[driver] Build completed: 00:00:00.091
[build] Build finished with exit code 0
[main] Building folder: vs-bug4 
[build] Starting build
[proc] Executing command: "C:\Program Files\CMake\bin\cmake.exe" --build c:/repos-nobackup/vs-bug4/build --config Debug --target all -j 14 --
[build] [1/2  50% :: 1.105] Building CXX object CMakeFiles\bug4.dir\main.cpp.obj
[build] C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.36.32532\include\tuple(187) : warning C26432: If you define or delete any default operation in the type 'class std::tuple<>', define or delete them all (c.21).
[build] C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.36.32532\include\xstring(4874) : warning C26447: The function is declared 'noexcept' but calls function 'deallocate()' which may throw exceptions (f.6).
[build] C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.36.32532\include\xstring(2323) : warning C26432: If you define or delete any default operation in the type 'union std::_String_val<struct std::_Simple_types<char32_t> >::_Bxty', define or delete them all (c.21).
[build] C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.36.32532\include\xstring(4874) : warning C26447: The function is declared 'noexcept' but calls function 'deallocate()' which may throw exceptions (f.6).
[build] C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.36.32532\include\xstring(2323) : warning C26432: If you define or delete any default operation in the type 'union std::_String_val<struct std::_Simple_types<char16_t> >::_Bxty', define or delete them all (c.21).
[build] C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.36.32532\include\xstring(4874) : warning C26447: The function is declared 'noexcept' but calls function 'deallocate()' which may throw exceptions (f.6).
[build] C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.36.32532\include\xstring(2323) : warning C26432: If you define or delete any default operation in the type 'union std::_String_val<struct std::_Simple_types<wchar_t> >::_Bxty', define or delete them all (c.21).
[build] C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.36.32532\include\xstring(4874) : warning C26447: The function is declared 'noexcept' but calls function 'deallocate()' which may throw exceptions (f.6).
[build] C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.36.32532\include\xstring(2323) : warning C26432: If you define or delete any default operation in the type 'union std::_String_val<struct std::_Simple_types<char> >::_Bxty', define or delete them all (c.21).
[build] C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.36.32532\include\xstring(2273) : warning C26485: Expression 'this->_Bx._Buf': No array to pointer decay (bounds.3).
[build] C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.36.32532\include\xmemory(943) : warning C26440: Function 'std::allocator<char32_t>::deallocate' can be declared 'noexcept' (f.6).
[build] C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.36.32532\include\xmemory(943) : warning C26440: Function 'std::allocator<char16_t>::deallocate' can be declared 'noexcept' (f.6).
[build] C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.36.32532\include\xmemory(943) : warning C26440: Function 'std::allocator<wchar_t>::deallocate' can be declared 'noexcept' (f.6).
[build] C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.36.32532\include\xmemory(943) : warning C26440: Function 'std::allocator<char>::deallocate' can be declared 'noexcept' (f.6).
[build] C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.36.32532\include\utility(756) : warning C26473: Don't cast between pointer types where the source type and the target type are the same (type.1).
[build] C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.36.32532\include\utility(757) : warning C26473: Don't cast between pointer types where the source type and the target type are the same (type.1).
[build] C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.36.32532\include\xstring(2673) : warning C26485: Expression '_My_data->_Bx._Buf': No array to pointer decay (bounds.3).
[build] C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.36.32532\include\xstring(2701) : warning C26481: Don't use pointer arithmetic. Use span instead (bounds.1).
[build] C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.36.32532\include\xstring(2673) : warning C26485: Expression '_My_data->_Bx._Buf': No array to pointer decay (bounds.3).
[build] C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.36.32532\include\xstring(2701) : warning C26481: Don't use pointer arithmetic. Use span instead (bounds.1).
[build] C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.36.32532\include\xstring(2673) : warning C26485: Expression '_My_data->_Bx._Buf': No array to pointer decay (bounds.3).
[build] C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.36.32532\include\xstring(2701) : warning C26481: Don't use pointer arithmetic. Use span instead (bounds.1).
[build] C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.36.32532\include\xstring(2673) : warning C26485: Expression '_My_data->_Bx._Buf': No array to pointer decay (bounds.3).
[build] C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.36.32532\include\xstring(2701) : warning C26481: Don't use pointer arithmetic. Use span instead (bounds.1).
[build] C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.36.32532\include\xmemory(298) : warning C26457: (void) should not be used to ignore return values, use 'std::ignore =' instead (es.48).
[build] C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.36.32532\include\xmemory(298) : warning C26457: (void) should not be used to ignore return values, use 'std::ignore =' instead (es.48).
[build] C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.36.32532\include\xmemory(298) : warning C26457: (void) should not be used to ignore return values, use 'std::ignore =' instead (es.48).
[build] C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.36.32532\include\xmemory(298) : warning C26457: (void) should not be used to ignore return values, use 'std::ignore =' instead (es.48).
[build] C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.36.32532\include\xmemory(252) : warning C26447: The function is declared 'noexcept' but calls function '_Adjust_manually_vector_aligned()' which may throw exceptions (f.6).
[build] C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.36.32532\include\xmemory(255) : warning C26409: Avoid calling new and delete explicitly, use std::make_unique<T> instead (r.11).
[build] C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.36.32532\include\xmemory(1456) : warning C26432: If you define or delete any default operation in the type 'struct std::_Container_proxy_ptr12<class std::allocator<struct std::_Container_proxy> >', define or delete them all (c.21).
[build] C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.36.32532\include\xstring(2639) : warning C26457: (void) should not be used to ignore return values, use 'std::ignore =' instead (es.48).
[build] C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.36.32532\include\xstring(2640) : warning C26457: (void) should not be used to ignore return values, use 'std::ignore =' instead (es.48).
[build] C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.36.32532\include\xstring(2639) : warning C26457: (void) should not be used to ignore return values, use 'std::ignore =' instead (es.48).
[build] C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.36.32532\include\xstring(2640) : warning C26457: (void) should not be used to ignore return values, use 'std::ignore =' instead (es.48).
[build] C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.36.32532\include\xstring(2639) : warning C26457: (void) should not be used to ignore return values, use 'std::ignore =' instead (es.48).
[build] C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.36.32532\include\xstring(2640) : warning C26457: (void) should not be used to ignore return values, use 'std::ignore =' instead (es.48).
[build] C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.36.32532\include\xstring(2639) : warning C26457: (void) should not be used to ignore return values, use 'std::ignore =' instead (es.48).
[build] C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.36.32532\include\xstring(2640) : warning C26457: (void) should not be used to ignore return values, use 'std::ignore =' instead (es.48).
[build] C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.36.32532\include\type_traits(2159) : warning C26490: Don't use reinterpret_cast (type.1).
[build] C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.36.32532\include\type_traits(2159) : warning C26490: Don't use reinterpret_cast (type.1).
[build] C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.36.32532\include\type_traits(2159) : warning C26490: Don't use reinterpret_cast (type.1).
[build] C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.36.32532\include\type_traits(2159) : warning C26490: Don't use reinterpret_cast (type.1).
[build] C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.36.32532\include\type_traits(1439) : warning C26473: Don't cast between pointer types where the source type and the target type are the same (type.1).
[build] C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.36.32532\include\xmemory(1100) : warning C26447: The function is declared 'noexcept' but calls function 'deallocate()' which may throw exceptions (f.6).
[build] C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.36.32532\include\xmemory(656) : warning C26440: Function 'std::_Default_allocator_traits<std::allocator<std::_Container_proxy> >::deallocate' can be declared 'noexcept' (f.6).
[build] C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.36.32532\include\xutility(236) : warning C26492: Don't use const_cast to cast away const or volatile (type.3).
[build] C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.36.32532\include\xutility(236) : warning C26474: Don't cast between pointer types when the conversion could be implicit (type.1).
[build] C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.36.32532\include\type_traits(1439) : warning C26473: Don't cast between pointer types where the source type and the target type are the same (type.1).
[build] C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.36.32532\include\xutility(236) : warning C26492: Don't use const_cast to cast away const or volatile (type.3).
[build] C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.36.32532\include\xutility(236) : warning C26474: Don't cast between pointer types when the conversion could be implicit (type.1).
[build] C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.36.32532\include\type_traits(1439) : warning C26473: Don't cast between pointer types where the source type and the target type are the same (type.1).
[build] C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.36.32532\include\xutility(236) : warning C26492: Don't use const_cast to cast away const or volatile (type.3).
[build] C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.36.32532\include\xutility(236) : warning C26474: Don't cast between pointer types when the conversion could be implicit (type.1).
[build] C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.36.32532\include\type_traits(1439) : warning C26473: Don't cast between pointer types where the source type and the target type are the same (type.1).
[build] C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.36.32532\include\xutility(236) : warning C26492: Don't use const_cast to cast away const or volatile (type.3).
[build] C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.36.32532\include\xutility(236) : warning C26474: Don't cast between pointer types when the conversion could be implicit (type.1).
[build] C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.36.32532\include\type_traits(1439) : warning C26473: Don't cast between pointer types where the source type and the target type are the same (type.1).
[build] C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.36.32532\include\xutility(236) : warning C26492: Don't use const_cast to cast away const or volatile (type.3).
[build] C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.36.32532\include\xutility(236) : warning C26474: Don't cast between pointer types when the conversion could be implicit (type.1).
[build] C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.36.32532\include\type_traits(1439) : warning C26473: Don't cast between pointer types where the source type and the target type are the same (type.1).
[build] C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.36.32532\include\xmemory(136) : warning C26429: Symbol '_Ptr' is never tested for nullness, it can be marked as not_null (f.23).
[build] C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.36.32532\include\xmemory(137) : warning C26481: Don't use pointer arithmetic. Use span instead (bounds.1).
[build] C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.36.32532\include\xmemory(140) : warning C26481: Don't use pointer arithmetic. Use span instead (bounds.1).
[build] C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.36.32532\include\xmemory(134) : warning C26490: Don't use reinterpret_cast (type.1).
[build] C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.36.32532\include\xmemory(136) : warning C26490: Don't use reinterpret_cast (type.1).
[build] [2/2 100% :: 1.315] Linking CXX executable bug4.exe
[driver] Build completed: 00:00:01.370
[build] Build finished with exit code 0

@frederick-vs-ja
Copy link
Contributor

...yes and... the sideaffect of this STL codebase when used on MSVC (vs2022) code analyzer generates a LOT of noise in very simple programs.

See also #3081.

It's a bit suprising to me that the exception specification of allocator<T>::deallocate hasn't been strengthened...

@diablodale
Copy link

To scope the size of STL analyzer warnings, I have 10+ thousands of warnings from STL while compiling my app with the VC's analyzer as above. I uses a tiny fraction of STL so there are far more STL analyzer warnings present that I haven't seen.

Some warnings are invalid like @StephanTLavavej wrote "use gsl but gsl needs stl circular". Others are more curious like algorithm(3453) : warning C26820: This is a potentially expensive copy operation. Consider using a reference unless a copy is required (p.9) and xutility(1222) : warning C26800: Use of a moved from object: ''(*_Where)'' (lifetime.1).: Lines: 1200, 1201, 1204, 1208, 1209, 1211, 1212, 1217, 1221, 1222

I am able to silence analyzer warnings in my specific app's STL usage with

add_compile_definitions(
    _STL_EXTRA_DISABLED_WARNINGS=26485\ 26432\ 26490\ 26455\ 26492\ 26481\ 26473\ 26472\ 26462\ 26440\ 26474\ 26457\ 26494\ 26800\ 26496\ 26447\ 26818\ 26460\ 26409\ 26436\ 26408\ 26401\ 26497\ 26496\ 26461\ 26475\ 26403\ 26465\ 26445\ 26491\ 26411\ 26495\ 26493\ 26467\ 26415\ 26418\ 26459\ 26439\ 26417\ 26437\ 26400\ 26466\ 26820\ 26416
)

Not directly related to STL...is that MSVC distributes many other headers (like ppltasks.h) in the same folder as STL. These other headers don't have a injector like _STL_EXTRA_DISABLED_WARNINGS and throw thousands of analyzer warnings themselves. Making STL's flood of warnings just another part of the flood. :-/ This again points to the need of a joint plan between STL and MSVC teams.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
test Related to test code
Projects
None yet
Development

No branches or pull requests

5 participants