我很想知道MSVC编译器是否有任何可能在它首次编写时(一年前)出现以下错误的选项。在那段时间里,bug被复制并粘贴到代码中的其他几个地方。通过权利应该每隔几秒就造成崩溃。幸运的是,它每隔几个小时才会崩溃,而且通常只会留下很少的证据来调试。有缺陷的代码的本质是:
int someDataSubjectToMultiThreadAccess;
CCriticalSection someSyncObject;
...
int SomeFunction( void )
{
CSingleLock( someSyncObject, TRUE );
return someDataSubjectToMultiThreadAccess;
}
我不打算突出显示错误 - Visual Studio编译器当然不会!如果看不到错误,请创建一个测试文件,编译它,然后查看.cod文件以查看生成的汇编程序。使用我的优化设置,它调用CSingleLock
构造函数来创建一个临时对象,然后立即调用相应的析构函数,它(通过优化?)是CSingleLock::Unlock()
函数。最后,访问共享数据而不实际被锁定。
所以这是一个关于如何通过省略遍及函数范围的变量 - CSingleLock vitalLockVariable( someLock, TRUE );
来创建一个完全无效的锁定机制的警示故事。令我感到惊讶的是,有多少只眼睛看过这段代码而没有注意到这个错误。
我将为您节省一些输入此建议的工作:“使用boost同步原语”。是的 - 谢谢 - 有一天我可能会。但这种滑动可能同样适用于他们。
我真正想知道的是有哪些工具可用于捕获此类事物,最好是在键入的时刻,但通过除代码审查之外的任何其他方式或尝试分析令人困惑的崩溃。