对于以下代码段:
size_t i = 0;
std::wstring s;
s = (i < 0) ? L"ABC" : L"DEF";
s = (i != -1) ? L"ABC" : L"DEF";
Run Code Online (Sandbox Code Playgroud)
i < 0正如预期的那样,PVS-Studio分析记录第一个条件的警告:
V547 Expression 'i < 0' is always false. Unsigned type value is never < 0. test_cpp_vs2017.cpp 19
例如,为什么PVS不会发出关于第二个,也是可疑情况的警告,并将其i != -1报告为总是如此?
PVS-Studio,静态代码分析器,用于以下代码
size_t const n = 4;
int a[n] = {};
Run Code Online (Sandbox Code Playgroud)
报告:
V112使用的危险幻数
4:...t const n = 4;. test.cpp 3
尽管PVS-Studio与Visual Studio 2017项目一起使用并报告32位和64位的相同警告,但分析器AFAIU不会考虑这些构建配置.
我本来期望更好地分析上下文并将上面的代码视为等同于此
int a[4] = {};
Run Code Online (Sandbox Code Playgroud)
PVS-Studio不会发出任何诊断信息.
在上面这种情况下使用了这个危险的幻数N,是假阳性?
上面两个代码示例没有被分析为等价的原因是什么?
我知道无符号整数是臭名昭著的,C++ 开发人员通常会避免使用无符号整数。我有一个包含两个int不应包含负值的成员变量的类:
.
.
.
private:
int m_Y_AxisLen;
int m_X_AxisLen;
.
.
.
Run Code Online (Sandbox Code Playgroud)
我以防止输入任何负数的方式设计了成员函数的逻辑。所以我确保这两个成员不会被分配负值。但是当我使用PVS-Studio
时,这也会带来一些警告。例如这里:
for ( int row = 0; row < getY_AxisLen( ); ++row )
{
for ( int column = 0; column < getX_AxisLen( ) - 1; ++column )
{
if ( m_characterMatrix[ row ][ column ] == getFillCharacter( ) )
{
m_characterMatrix[ row ][ column ] = fillCharacter;
}
}
}
Run Code Online (Sandbox Code Playgroud)
PVS-Studio 责怪我的索引row和类型column不正确memsize。这可能意味着我应该使用std::size_t row …
通过在PVS-Studio中进行一些代码分析,它给了我一些警告消息。
我在头文件中有以下语句:
constexpr int MIN_ALLOWED_Y { 0 };
Run Code Online (Sandbox Code Playgroud)
在源文件中:
std::make_pair<const int, const int>( std::move( MIN_ALLOWED_Y ), std::move( MAX_ALLOWED_Y ) )
Run Code Online (Sandbox Code Playgroud)
在上面的表达式中,我曾经std::move转换MIN_ALLOWED_Y为 xvalue,因为我认为std::make_pair只接受右值;
// from https://en.cppreference.com/w/cpp/utility/pair/make_pair
template< class T1, class T2 >
constexpr std::pair<V1,V2> make_pair( T1&& t, T2&& u );
Run Code Online (Sandbox Code Playgroud)
但我收到如下警告消息:
V833 Passing the const-qualified object 'MIN_ALLOWED_Y' to the 'std::move' function disables move semantics.
Run Code Online (Sandbox Code Playgroud)
这是有效的警告吗?如果是这样那我该怎么办?我应该删除std::move(也许在这种情况下它是多余的?)?
更好的问题是哪里不应该使用std::move?