我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的"坏样式",我也在编译中运行吗?
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?
我有以下代码,它正常工作:
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- 否则检查空值是多余的.
我不明白为什么.如果dataobj是NULL,那么结果将是其他的东西ERRORCODE_OK.
在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 代码,当我使用 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++ 代码中有以下结构。
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没有该字段x,y并且z。
[test.cc:122]: (error: uninitStructMember) Uninitialized struct member: data_point_1.x
[test.cc:122]: …Run Code Online (Sandbox Code Playgroud) 我希望能够编写两套规则:
忽略错误的规则集,例如
规则集包括 ALL ,但我可以手动忽略一个或多个规则集
考虑到:
cppcheck 将检查内存泄漏。对于类,仅在给出“--all”时才进行检查。原因是如果自动释放实例,将会出现误报。
我运行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) 我的项目中有依赖项作为源,我无法控制.我正在使用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)一起使用,那将非常好.谢谢.
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标志却有所不同。我在这里错过了什么吗?任何帮助表示赞赏!
cppcheck ×10
c++ ×6
c ×3
clang-tidy ×1
cmake ×1
double ×1
g++ ×1
googletest ×1
pointers ×1
portability ×1
sonarqube ×1
warnings ×1