Tag: 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 并将此视为错误,而不是可移植性问题。 它是C代码(包含在C ++主导的项目中),使用C ++ 98兼容编译器编译,同时按预期运行数十年。 […]

scanf Cppcheck警告

Cppcheck为scanf显示以下警告: 消息:没有字段宽度限制的scanf可能会因巨大的输入数据而崩溃。 要修复此错误消息,请添加字段宽度说明符:%s =>%20s%i =>%3i可能崩溃的示例程序:#include int main(){int a; scanf(“%i”,&a); 返回0; 使它崩溃:perl -e’print“5”x2100000’| ./a.out 我无法崩溃这个程序输入“巨大的输入数据”。 我应该输入什么才能让这次崩溃? 我也不明白这个警告中最后一行的含义: perl -e …

推荐的方法来跟踪C程序中数组越界访问/写入

考虑在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 && […]