标签: pvs-studio

表达式'i <0'始终为假

对于以下代码段:

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报告为总是如此?

c++ unsigned static-analysis pvs-studio

25
推荐指数
3
解决办法
4196
查看次数

使用了危险幻数N.

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++ static-analysis pvs-studio

5
推荐指数
1
解决办法
331
查看次数

处理无符号整数

我知道无符号整数是臭名昭著的,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 …

c++ arrays static-code-analysis unsigned-integer pvs-studio

5
推荐指数
1
解决办法
735
查看次数

将 const 限定对象传递给“std::move”

通过在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

c++ static-code-analysis move-semantics pvs-studio

1
推荐指数
1
解决办法
150
查看次数