5

背景: 私が取り組んでいるコード ベースは非常に大きく、アサートを多用しています。テストで見つかった多くの問題は、最終的に個々のアサート (ファイルと行番号) に関連付けられています。ただし、誰かがソース コードを変更すると、アサートに関連付けられた行番号が変更される可能性があり、アサートが再発した場合の追跡が難しくなります。

例: テスト中に、テスターが main.cpp:1808 でいくつかのアサートに遭遇したとします。このアサートに対してバグがバグ追跡システムに記録されます。翌日、誰かが main.cpp を変更します。テスト担当者がテストを再実行すると、同じアサートが引き続き発生しますが、main.cpp:1790 で発生することが報告されています。したがって、ソース コードを見ずに、これが新しいアサートなのか、以前に見られたアサートの再発なのかを判断することは困難です。

質問: 行番号に依存するのではなく、個々の assert() を一意の 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)
}
4

2 に答える 2

2

関数やアサーション テキストなど、行番号よりも少し広い基準を使用できます。例えば、

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

関数または条件が変更された場合、生成する UID が変更されなくても、別のエラーであり、個別に調査する必要があると主張できます。

于 2013-01-02T21:26:43.510 に答える
0

コードの変更を証明する方法がわかりません。多くの場合、コード追跡ソフトウェアは、コードのどの部分が正確に変更されたかを正しく識別できません。そのため、自動追跡はおそらく失敗します。assertuidなしで既存のものをすべて列挙する簡単なプログラムを書くことをお勧めします。プログラムは、aasertたとえば のように sth に変更する必要がありASSERT(height < 10, "aagcodkv73");ます。そのスクリプトをコミット段階に接続します。

このようにして、誰かが新しいアサーションを追加するたびに、それは独自の uid を取得します。そのuidは開発者によって保持されます

于 2013-01-02T21:14:38.410 に答える