我已经发现了另一个问题,即Windows/MingW没有为过时的usleep()提供nanosleep()和setitimer()替代方案.但我的目标是修复cppcheck给我的所有警告,包括usleep()样式警告.
那么,是否有一种解决方法可以在不使用cygwin或安装大量新依赖项/库的情况下以某种方式避免使用Windows上的usleep()?谢谢.
我想使用Cppcheck进行C++代码的静态代码分析.我了解到我可以用--inline-suppr命令抑制某种警告.但是,我无法在评论中找到"suppress_error_id":
// cppcheck-suppress "suppressed_error_id"
Run Code Online (Sandbox Code Playgroud) 我一直在尝试使用clang-modernize与CMAKE_EXPORT_COMPILE_COMMANDS在该工具的帮助推荐.
使用此选项,cmake会生成一个包含编译信息(如include路径)的JSON文件(另请参阅).
此变量在cmake的命令行中被接受,但cmake --help-variable CMAKE_EXPORT_COMPILE_COMMANDS不起作用(这与此邮件列表发布一致).
有人知道如何使用它吗?
我也可以用cppcheck.
更多信息
我在clang开发者论坛上发现,这个cmake功能并非在所有生成器上都可用.这可能会在未来发生变化,同时我的问题仍然存在,我也会尝试看看如果我使用其他生成器而不是Visual Studio会发生什么.
cppcheck甚至找不到像iostream这样的标准头文件.有任何想法吗?
我正在使用Ubuntu 11.04和cppcheck来自存储库.
从版本1.80开始,Cppcheck告诉我
表达式'msg [ipos ++] =校验和(&msg [1],ipos-1)'取决于副作用的评估顺序
在这个代码序列中(简化,data是一个变量)
BYTE msg[MAX_MSG_SIZE]; // msg can be smaller, depending on data encoded
int ipos = 0;
msg[ipos++] = MSG_START;
ipos += encode(&msg[ipos], data);
msg[ipos++] = checksum(&msg[1], ipos-1); // <---- Undefined Behaviour?
msg[ipos++] = MSG_END; // increment ipos to the actual size of msg
Run Code Online (Sandbox Code Playgroud)
并将此视为错误,而不是可移植性问题.
它是C代码(包含在C++主导的项目中),使用C++ 98兼容编译器编译,同时按预期运行数十年.Cppcheck使用C++ 03,C89,自动检测语言运行.
我承认代码应该更好地重写.但在此之前,我试图弄清楚:它真的依赖于评估顺序吗?根据我的理解,正在首先评估正确的操作数(它需要在调用之前),然后msg[ipos]使用ipos最后完成的增量进行赋值(to ).
我错了这个假设,还是只是假阳性?
考虑在C中编写一些不那么明显的算法的实现.例如,让我们在KN King的"C编程:现代方法,第2版"一书中找到它的递归快速排序,它可以从这里获得.最有趣的部分包括以下两个定义:
void quicksort(int a[], int low, int high)
{
int middle;
if (low >= high)
return;
middle = split(a, low, high);
quicksort(a, low, middle - 1);
quicksort(a, middle + 1, high);
}
int split(int a[], int low, int high)
{
int part_element = a[low];
for (;;) {
while (low < high && part_element <= a[high])
high--;
if (low >= high)
break;
a[low++] = a[high];
while (low < high && a[low] <= part_element)
low++;
if (low >= high) …Run Code Online (Sandbox Code Playgroud) 如果我启动我的cppcheck我得到以下错误:cppcheck ListLib.c(信息)无法加载std.cfg.您的Cppcheck安装已损坏,请重新安装.Cppcheck二进制文件是在CFGDIR设置为"/ usr/bin/cfg"的情况下编译的,因此将在该路径中搜索std.cfg.
系统:opensuse13,cppcheck版本:cppcheck-1.64,编译:make SRCDIR = build CFGDIR =/usr/bin/cfg HAVE_RULES = yes
检查文件是否存在:ls/usr/bin/cfg:gtk.cfg posix.cfg qt.cfg sdl.cfg std.cfg windows.cfg
where cfg:cfg:/ usr/bin/cfg
whereis std.cfg:std:/usr/bin/cfg/std.cfg
cat std:/usr/bin/cfg/std.cfg给我该文件的输出
堆栈跟踪:
lstat("/home/.../ListLib.c", {st_mode=S_IFREG|0644, st_size=4568, ...}) = 0
stat("/home/.../ListLib.c", {st_mode=S_IFREG|0644, st_size=4568, ...}) = 0
open("std.cfg", O_RDONLY) = -1 ENOENT (No such file or directory)
open("cfg/std.cfg", O_RDONLY) = -1 ENOENT (No such file or directory)
write(2, "(information) Failed to load std"..., 213) = 213
write(2, "\n", 1) = 1
exit_group(1) = ?
+++ exited with 1 +++ …Run Code Online (Sandbox Code Playgroud) 我们的团队以前使用Lint作为静态代码分析器,但它变得过于混乱并且噪音太大.
我们使用C++ 03经常使用Boost,而Lint似乎不喜欢Boost(我听说这在后来的版本中变得更好).我开始查看其他静态代码分析器并遇到了Cppcheck并尝试了它.我对它所警告的内容印象深刻(我看过十几个信息和风格问题).
我感兴趣的是:是否有Cppcheck发布的所有Cppcheck消息的列表,类似于Lint和PVS-Studio 如何都有他们的消息列表?该官方网站Cppcheck名单:
但是我对类似于Lint和PVS-Studio的东西更感兴趣,并且类似于在Visual Studio中显示结果的方式:
ID | Category/Severity | Text
Run Code Online (Sandbox Code Playgroud) 我不是要问各种可用的第三方模块以某种方式支持Cppcheck.
有了CMake 3.10,CMake似乎获得了一些官方的Cppcheck支持.请参阅CMAKE_ <LANG> _CPPCHECK.
不幸的是,如何使用这个变量的文档有点稀疏.是否有一个很好的例子说明Cppcheck应该如何与CMake 3.10(或更高版本)一起使用?