通常人们会对正在编码的特定平台做出假设,例如,有符号整数使用两个补码存储,或者那个(0xFFFFFFFF == -1)或那些性质的东西.
是否存在可以检查代码库以查找最常见的违反这类事件的工具(对于我们这些想要可移植代码但没有奇怪的非二进制补充机器的人)?
(我上面的示例特定于有符号整数,但我也对其他错误(例如对齐或字节顺序)感兴趣)
我最近从一个刚退休的人那里继承了一个用Managed C++编写的程序.花了一些时间挖掘它之后,我可以诚实地说它至少有95%属于thedailywtf.但是,我现在的任务是修改它并将其移植到我熟悉的语言中.
程序本身会从文件中读取许多参数(50+)并执行一系列计算并吐出报告.一旦我完成了3个字母变量的页面(其中许多重复用于完全不相关的目的),我需要想出一种方法来测试我的代码,以确保它提供与之前相同的答案码.
这很可能是一厢情愿的想法,但有没有任何自动代码分析工具可以帮助我以任何方式或形式完成这项任务?
我将把它移植到Java.
考虑以下代码:
@Test
public void testDeadCode() {
letsThrow();
System.out.println("will never be reached");
}
private final void letsThrow() {
throw new RuntimeException("guess you didnt see this one coming");
}
Run Code Online (Sandbox Code Playgroud)
对我来说,println()似乎绝对不可能执行 - 因为对letsThrow()的调用将始终抛出异常.
我就是这样
a)惊讶于编译器无法告诉我"这是死代码"
b)想知道是否有一些编译器标志(或eclipse设置)会告诉我:你那里有死代码.
通常我可以使用一些工具来静态分析我的代码,以帮助我使其更清洁.像编译器警告的东西,但这些还不够.我时不时地想要写一个(使用clang库或gccxml),但我想这需要太多的工作.
我想到的一些事情是:
寻找神奇的数字(即:不同于0的硬编码常数).
检查三个规则是否始终受到尊重(每个类必须定义所有析构函数,复制构造函数和赋值运算符,或者都不定义).
我也梦想(但这些东西都是纯粹的乌托邦)关于预处理器,它解析一些非标准代码并将其转换为有效的C++代码,这个工具能够:
扩展模板别名,以便我可以在C++中使用它们(好吧,使用C++ 0x不再需要它)
在文件末尾移动内联函数,这样我就不必遵守declare-before-use规则,并且能够像在Java中一样编写内联类.
提供扩展语法,如支持自定义运算符(将在函数调用中扩展),或一些特殊语法/关键字,以轻松实现某些模式.
有没有任何工具,能够做这些事情的一部分?
否则你会建议哪些库来实现这些任务(clang libs,gccxml,...),你认为需要做多少工作?
我正在使用cppcheck进行静态分析.为了加快审查过程,我想设置cppcheck来查找一些自定义规则,例如检查geter函数是否定义为const.
如果有人有为cppcheck编写自定义规则的经验,那么你能提供一些编写自定义规则的例子吗?
PS我已经做了一些研究,找到了一个工具,可以让我编写自定义规则,让审查过程更快.我找到了关于这个主题的这些链接
我继承了一个相当大的代码库,不幸的是它表现出很多"坏习惯".我最大的个人宠物之一是在一个表达式中声明几个变量,如下所示:
int x, y, z;
Run Code Online (Sandbox Code Playgroud)
个人而言,我更喜欢:
int x;
int y;
int z;
Run Code Online (Sandbox Code Playgroud)
这使我可以轻松地单独调整类型,并避免指针类型的问题,如下所示:
int *x, y, z; // whoops I meant to make y and z pointers too!
Run Code Online (Sandbox Code Playgroud)
此外,我很想检测何时类型的大小大于sizeof(void*)值传递的类型.
还有其他"风格"问题,我想检测和纠正,但这些是最讨厌的IMO.什么是最好的工具?
我继承了一个大的c ++代码库,我有一个任务,以避免代码库中可能发生的任何空指针异常.是否有可用的静态分析工具,我在想,你已经成功使用了.
你还有什么其他的东西?
有没有一个很好的理由为什么这个代码在没有警告的情况下编译(并在运行时崩溃)与Visual C++ 2010:
int a = *((int*)nullptr);
Run Code Online (Sandbox Code Playgroud)
静态分析应该得出结论它会崩溃,对吧?
我对内存泄漏非常谨慎,所以我认为我已经验证了这一点.在下面的例子中会出现内存泄漏吗?我的直觉是肯定的.
class Handler // Class definition
{public:
~Handler();
int* ptrToInts;
};
Handler::~Handler() // Class destructor
{
delete[] ptrToInts;
}
Handler handler; // Global object
void aFunction()
{
handler.ptrToInts = new int[20];
}
int main()
{
bool quit = false;
while(!quit)
{
aFunction();
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
在heapeach时间,ptrToInts会在单独的内存中创建20个单独的新int?
另外,另一个问题是,如果不是析构函数,是否会释放动态分配的内存?看到类的生命周期是程序的持续时间,它会清除所有"新"内存吗?
编辑:谢谢你的回答.我问这个的原因是因为我试图绕过调用new并删除WadProc每次基本上调用Raw Input,这就是MSDN告诉你这样做的方式.似乎非常低效.
c++ ×10
java ×2
visual-c++ ×2
c++11 ×1
coding-style ×1
compilation ×1
cppcheck ×1
dead-code ×1
heap ×1
managed-c++ ×1
memory ×1
memory-leaks ×1
null ×1
nullptr ×1
parsing ×1
pointers ×1
preprocessor ×1