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