CPPCHECK C++成员函数上的格式字符串

cppcheck format string on member functions of C++

本文关键字:格式 字符串 函数 C++ 成员 CPPCHECK      更新时间:2023-10-16

aa.h

#ifndef __US_LOG_FILEA_H_
#define __US_LOG_FILEA_H_
namespace AA{
class A{
public:
A();
~A();
static A& Ins(){
static A obj;
return obj;
}
void do_p(const char *cat, int level, const char *Format ...);  // ok
void do_p(const char *cat, int level, const char *Format, ...);  // error
};
} // namespace AA
extern AA::A g_A;
#endif // __US_LOG_FILEA_H_

格式.cpp

void test()
{
g_A.do_p("global func", 2, "%sn", str);
}

答.cfg:

<?xml version="1.0"?>
<def>
<function name="AA::A::do_p">
<noreturn>false</noreturn>
<leak-ignore/>
<formatstr type="printf"/>
<arg nr="3">
<formatstr/>
<not-uninit/>
</arg>
</function>
</def>

cppcheck --enbale-style --library=a.cfg formatstr.cpp

如果无效do_p(常量字符*猫,整数级别,常量字符*格式...(; CPP 检查输出: 警告:格式字符串(第 1 号(中的 %s 需要"字符 *"bu t 参数类型为"std::string"。[invalidPrintfArgType_s] g_A.do_p("global func", 2, "%s", str(;

但do_p(常量字符 *猫,整数级别,常量字符 *格式,...(; CPP 检查输出无

为什么?

Cppcheck的版本是1.89.0.0

提前谢谢。

为什么?

void do_p(const char *cat, int level, const char *Format ...);  // ok

大概是因为 cppcheck 无法将const char *Format ...识别为 printf 格式和可变参数,除非它们用逗号分隔,所以你没有收到错误。

void do_p(const char *cat, int level, const char *Format, ...);  // error

您配置了 cppcheck 以检查错误的格式/参数配对,因此这是您应该出现错误的地方。

1st,将 Cpp 成员函数代码修改为 C 样式函数
2nd,删除重载功能