C++自动方式使截断在运行时打印错误

Dal*_*ale 3 c++ truncation

我刚加入了一个拥有数千行代码的团队,如:

int x = 0; 
x=something(); 
short y=x; 
doSomethingImportantWith(y); 
Run Code Online (Sandbox Code Playgroud)

编译器提供了很好的警告:将XX位类型值转换为"short"会导致截断.我被告知,没有任何情况下截断确实发生,但我严重怀疑它.

是否有一种很好的方法可以将检查插入到具有以下效果的每种情况中:

if (x>short.max) printNastyError(__FILE,__LINE); 
Run Code Online (Sandbox Code Playgroud)

在每次任务之前?手动执行此操作将花费更多的时间和精力,并且编写一个脚本来读取警告并将这些内容添加到正确的文件以及所需的包含似乎有点过分 - 特别是因为我希望有人已经完成这个(或类似的东西).

我不关心性能(真的)或除了知道这些问题何时发生以外的任何事情,所以我可以解决那些真正重要的问题,或者说我可以说服管理层这是一个问题.

Max*_*kin 5

您可以尝试使用以下丑陋的黑客编译和运行它:

#include <limits>
#include <cstdlib>

template<class T>
struct IntWrapper
{
    T value;

    template<class U>
    IntWrapper(U u) {
        if(u > std::numeric_limits<T>::max())
            std::abort();
        if(U(-1) < 0 && u < std::numeric_limits<T>::min()) // for signed U only
            std::abort();
        value = u;
    }

    operator T&() { return value; }
    operator T const&() const { return value; }
};

#define short IntWrapper<short>

int main() {
    int i = 1, j = 0x10000;
    short ii = i;
    short jj = j; // this aborts
}
Run Code Online (Sandbox Code Playgroud)

显然,它可能会破坏short作为模板参数传递的代码,并可能在其他实例中,因此在它破坏构建的地方取消定义.并且您可能需要添加运算符重载,以便通常的算法与包装器一起使用.