标签: cppcheck

由于语法奇怪,"非套接字上的套接字操作"错误

Socket operation on non-socket在调用时遇到了一些网络代码中的错误,connect并花了很多时间试图找出导致它的原因.我终于发现以下代码行导致了问题:

if ((sockfd = socket( ai->ai_family, ai->ai_socktype, ai->ai_protocol) < 0)) {
Run Code Online (Sandbox Code Playgroud)

看到问题?这是该行应该是什么样子:

if ((sockfd = socket( ai->ai_family, ai->ai_socktype, ai->ai_protocol)) < 0) {
Run Code Online (Sandbox Code Playgroud)

我不明白的是为什么第一行不正确的行不会产生警告.换句话说,不应该是一般形式:

if ( foo = bar() < baz ) do_something();
Run Code Online (Sandbox Code Playgroud)

看起来奇怪的编译器,尤其是运行g++ -Wall -Wextra

如果不是,它不应该至少表现为cppcheck的"坏样式",我也在编译中运行吗?

c c++ g++ cppcheck

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

我怎么能告诉cppcheck跳过头文件

cppcheck扫描项目文件夹中的所有文件.

c:\projectfolder\main.c
c:\projectfolder\file.c
c:\projectfolder\file.h
c:\projectfolder\file_test.cc
Run Code Online (Sandbox Code Playgroud)

c:\projectfolder\file_test.cc 包含以下代码

#include "c:/gtest/gtest.h"

extern "C"
{
    #include "TMyStruct.h"
}

TEST(Stack, Overflow)
{
    TMyStruct unterTest;
    EXPECT_EQ(1, TMyStruct_Init(&unterTest));
    EXPECT_GE(unterTest.variable, 9000);
}
Run Code Online (Sandbox Code Playgroud)

file_test.cc包含gtest.h

C:\gtest\gtest.h
Run Code Online (Sandbox Code Playgroud)

不应测试C:\ gtest \中的所有文件.

我打电话

cppcheck.exe -ic:\gtest\ c:\projectfolder\ --enable=style --template="SomeError"
Run Code Online (Sandbox Code Playgroud)

file_test.cc从包含的c:\projectfolder\file_test.cc内容中找到并报告错误(详细信息:"太多#ifdef配置")

我怎么告诉cppcheck根本不看C:\ gtest\gtest.h?

googletest cppcheck

4
推荐指数
2
解决办法
6252
查看次数

可能的空指针取消引用 - 否则检查空值是多余的

我有以下代码,它正常工作:

int result = ERRORCODE_OK;
if (dataObj == NULL || dataObj->inputSignal == NULL)
{
   result = ERRORCODE_MISSING_DATAOBJ;
}
if (result == ERRORCODE_OK && dataObj->spectrum == NULL) // CPP-Check error
{
   result = Calculate(dataObj->inputSignal, .. );
} 
return result;
Run Code Online (Sandbox Code Playgroud)

但是CppCheck给了我以下错误:

可能的空指针取消引用:dataObj- 否则检查空值是多余的.

我不明白为什么.如果dataobjNULL,那么结果将是其他的东西ERRORCODE_OK.

c++ cppcheck

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

在包含浮点数的struct上使用memset()

在C/C++混合项目中,我发现了一些我可以减少的代码

#include <mem.h>

struct StructContainingDouble
{
    double d;
    /// other elements omitted
};

void clear(StructContainingDouble* p)
{
    memset(p, 0, sizeof *p);
}
Run Code Online (Sandbox Code Playgroud)

不停止Cppcheck提高可移植性警告

在包含浮点数的struct上使用memset().

消息是正确的,但由于浮点数被声明为double,因此它似乎是误报,因为在(正)零值的两倍中,按照IEEE 754标准进行编码:[*]

0 00000000000 0000000000000000000000000000000000000000000000000000
Run Code Online (Sandbox Code Playgroud)

因此,我倾向于简单地压制警告而忘记它

void clear(ContainingDouble* p)
{
    // cppcheck-suppress memsetClassFloat
    memset(p, 0, sizeof *p);
}
Run Code Online (Sandbox Code Playgroud)

但也许这里真的存在可移植性问题?

附录:

实际代码基于Win32平台.该结构用于管理对共享内存的访问,这就是构造函数无用的原因.而且不仅是该结构的一个对象必须归零,而是嵌入另一个结构的数组,如下所示:

#include <mem.h>

struct Slot
{
    double d;
    // more members...
};

struct SharedMem
{
    Slot slots[2048];
    // more members...
};

void clear(SharedMem* p)
{
    memset(p, 0, sizeof *p);
}
Run Code Online (Sandbox Code Playgroud)

[*] from: …

c c++ double portability cppcheck

4
推荐指数
3
解决办法
1320
查看次数

条件是多余的,或者可能存在空指针取消引用

我为嵌入式系统编写了一个 C 代码,当我使用 SonarQube 和 CppCheck 插件执行代码分析时,我得到了这个错误:

条件是多余的,或者可能存在空指针取消引用:指针。

这是有错误的代码:

ReturnCode_e SocketTcpSecureWrite( SocketHandle_t socketHandle, 
                                   char* dataBuffer, 
                                   uint16_t dataBufferLen, uint16_t* byteTransmitted )
{
    uint32_t bytes = 0;
    ReturnCode_e opResult = SSL_WRITE_ERROR;

    *byteTransmitted = 0;

    if( dataBuffer == NULL || byteTransmitted == NULL )
    {
        return WRONG_PARAMETER;
    }

    if( SEND_SOCKET( socketHandle, dataBuffer, dataBufferLen, 0, &bytes ) == SUCCESS )
    {
        *byteTransmitted = bytes;
        opResult = SUCCESS;
    }

    return opResult;
}
Run Code Online (Sandbox Code Playgroud)

我不明白为什么指针一致性检查会显示为错误。我想在执行函数之前验证指针不为NULL,否则返回错误。

这是检查指针一致性的正确方法吗?

c pointers static-code-analysis cppcheck sonarqube

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

C++ 未初始化的结构成员 - 字段不存在

我的 C++ 代码中有以下结构。

struct XYZ {
  double x;
  double y;
  double z;
};

struct Data {
  XYZ xyz_point;
  double item_1;
  double item_2;
  double item_3;
};
Run Code Online (Sandbox Code Playgroud)

在我的代码中,我创建了一个结构向量Data

std::vector<Data> data_vector;

for (i = 0; i < 5; i++) {
   Data data_point_1;
   data_point_1.xyz_point.x = 10.0;
   data_point_1.xyz_point.y = 11.0;
   data_point_1.xyz_point.z = 12.0;
   data_point_1.item_1 = 13.0;
   data_point_1.item_2 = 14.0;
   data_point_1.item_3 = 15.0;
   data_vector.push_back(data_point_1);
}
Run Code Online (Sandbox Code Playgroud)

代码构建成功,没有任何错误,但是在 CPP_Check 期间,我收到以下警告/错误。data_point_1没有该字段xy并且z

[test.cc:122]: (error: uninitStructMember) Uninitialized struct member: data_point_1.x
[test.cc:122]: …
Run Code Online (Sandbox Code Playgroud)

c++ cppcheck

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

我如何告诉 cppcheck 忽略某些错误?

我希望能够编写两套规则:

  1. 忽略错误的规则集,例如

    • 未初始化的变量
    • 变量作用域
  2. 规则集包括 ALL ,但我可以手动忽略一个或多个规则集

考虑到:

cppcheck 将检查内存泄漏。对于类,仅在给出“--all”时才进行检查。原因是如果自动释放实例,将会出现误报。

cppcheck

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

为什么cppcheck工具找不到未初始化的变量?

我运行commad(Ubuntu 12.04)

cppcheck test.cpp
Run Code Online (Sandbox Code Playgroud)

我期待来自cppcheck工具的未初始化变量警告.为什么cppcheck工具不能在命令行上打印它?

示例cpp代码:

#include <iostream>

class Foo
{
private:
    int m_nValue;

public:
    Foo();
    int GetValue() { return m_nValue; }
};

Foo::Foo()
{
    // Oops, we forget to initialize m_nValue
}

int main()
{
    Foo cFoo;
    if (cFoo.GetValue() > 0)
    {//...
    }
    else
    {//...
    }
}
Run Code Online (Sandbox Code Playgroud)

c++ warnings initialization cppcheck

3
推荐指数
2
解决办法
2101
查看次数

clang-tidy cmake从检查中排除文件

我的项目中有依赖项作为源,我无法控制.我正在使用cmake的clang-tidy集成来分析我的代码,而这种依赖性正在发出很多警告.有没有办法告诉cmake不要在特定文件上运行clang-tidy?
我试图将文件添加到-line-filterclang-tidy选项中,但这不起作用:

set_target_properties(target PROPERTIES
CXX_CLANG_TIDY "${clang_tidy_loc};\
${TIDY_CONFIG} \
-line-filter=\"[\
{\"name\":\"path/to/file.cpp\"},\
{\"name\":\"path/to/file.h\"}\
]\"")
Run Code Online (Sandbox Code Playgroud)

如果解决方案可以与其他静态分析器(如cppcheck)一起使用,那将非常好.谢谢.

static-analysis cmake cppcheck clang-tidy

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

如何执行 cppcheck 交叉翻译单元 (CTU) 静态分析?

Cppcheck 文档似乎暗示可以跨多个翻译单元进行分析,如--max-ctu-depths标志所示。这显然不适用于这里的玩具示例:

主要.cpp:

int foo();
int main (void)
{
    return 3 / foo();
}
Run Code Online (Sandbox Code Playgroud)

foo.cpp:

int foo(void)
{
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

即使设置了--enable=all--inconclusive,这个问题也不会出现在报告中。看起来 cppcheck 可能不是为进行跨文件分析而设计的,但该max-ctu-depths标志却有所不同。我在这里错过了什么吗?任何帮助表示赞赏!

c++ cppcheck

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