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

5
背景: 我正在处理的代码库非常庞大,且大量使用断言。在测试中发现的许多问题最终都与一个特定的断言(文件和行号)有关。但是,如果有人修改了源代码,则与断言相关联的行号可能会更改,这将使跟踪其是否再次出现变得困难。
例如:在测试期间,假设测试人员在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)
}

1
ASSERT的文本是否被认为是“独特”的,以至于您的缺陷系统可以查看它?绝对不完美。也许如果与函数名称结合起来,它就足够好了? - JaredC
1
如果可能的话,请从您的SCM工具中添加修订号或哈希。这可能需要与您的构建系统集成,它不会跟踪行,但这意味着在检查缺陷时可以检出相同的版本。 - Useless
不要使用ASSERT。编写自己的assert宏,从文件开头计数并添加分配给该特定模块的值,或者仅接受UID参数。 - Hot Licks
2个回答

2
您可以使用稍微宽泛一些的标准来进行筛选,比如函数和断言文本。例如:
#define ASSERT(cond) \
if(!(cond))          \
{                    \
    std::cerr << "Assertion failure: " 
              << __FILE__ << ":" << __FUNCTION__ << "-" << #cond << std::endl; \
    abort();         \
}                    \

有人可能会认为,即使生成的UID没有改变,但如果函数或条件发生了改变,仍然应该将其视为不同的错误并分别进行检查。


0

我看不出有什么方法可以证明代码更改的正确性。通常,代码跟踪软件无法正确识别哪部分代码已更改。因此,任何自动跟踪都可能失败。我建议编写一个简单的程序,枚举每个现有的未带有 uid 的 assert。该程序应将 assert 更改为类似于 ASSERT(height < 10, "aagcodkv73"); 的内容,并将该脚本连接到提交阶段。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接