如何将断言与唯一ID相关联?

时间:2013-01-02 21:06:01

标签: c++ debugging testing

背景:我正在处理的代码库非常庞大并且大量使用断言。测试中发现的大量问题最终与单个断言(文件和行号)相关联。但是,如果某人修改了源代码,则与断言关联的行号可能会发生变化,并且在重新发生时很难跟踪。

实施例: 在测试过程中,测试者会在main.cpp上遇到几个断言:1808。针对此断言将错误记录到我们的缺陷跟踪系统中。第二天有人修改了main.cpp。当测试人员重新执行他们的测试时,仍然会发生相同的断言但现在报告发生在main.cpp:1790。因此,如果不查看源代码,很难确定这是否是先前看到的断言的新断言或重新出现。

问题: 是否可以将每个assert()与一个唯一ID相关联,该ID将在代码更改后保留,而不是依赖于行号?我自己无法想到解决方案。我希望比我更聪明的人会有一些想法。以下是我认为解决方案的行为方式:

#include <iostream>
#include <string>
#include <assert.h>

using namespace std;

//Can ASSERT to redefined to generate a UID?
#define ASSERT assert

void main(void)
{
    std::string name;
    int age;

    std::cin >> name;
    ASSERT(name.length() < 10);     //Generate a UID if assert fails(ie 0001)
    std::cin >> age;
    ASSERT(age < 100);              //Generate a UID if assert fails(ie 0002)
}

经过一些代码更改

#include <iostream>
#include <string>
#include <assert.h>

using namespace std;

#define ASSERT assert

void main(void)
{
    std::string name;
    int age;
    int height;

    std::cin >> height;
    ASSERT(height < 10);          //Generate a UID if assert fails(ie 0003)
    std::cin >> name;
    ASSERT(name.length() < 10);   //Generate a UID if assert fails(ie 0001)
    std::cin >> age;
    ASSERT(age < 100);            //Generate a UID if assert fails(ie 0002)
}

2 个答案:

答案 0 :(得分:2)

您可以使用比行号稍宽的标准,例如函数和断言文本。例如,

#define ASSERT(cond) \
if(!(cond))          \
{                    \
    std::cerr << "Assertion failure: " 
              << __FILE__ << ":" << __FUNCTION__ << "-" << #cond << std::endl; \
    abort();         \
}                    \

有人可能会争辩说,如果函数或条件发生变化,即使你生成的UID没有变化,它仍然是一个不同的错误,应该单独查看。

答案 1 :(得分:0)

我认为没有办法证明代码更改。通常,代码跟踪软件无法正确识别哪部分代码已经发生了变化。所以任何自动跟踪都可能失败。我建议编写一个简单的程序,在没有uid的情况下枚举每个现有的assert。该计划应更改为aasert,例如ASSERT(height < 10, "aagcodkv73");。并将该脚本连接到提交阶段。

这种方式每当有人添加新断言时,它都会获得它自己的uid。并且uid将由开发人员保存