3

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

int x = 0; 
x=something(); 
short y=x; 
doSomethingImportantWith(y); 

编译器给出了很好的警告说:将 XX 位类型值转换为“短”会导致截断。有人告诉我,没有真正发生截断的情况,但我对此表示严重怀疑。

有没有一种很好的方法可以在每个案例中插入支票,效果如下:

if (x>short.max) printNastyError(__FILE,__LINE); 

在每次分配之前?手动执行此操作将花费比我想使用更多的时间和精力,并且编写一个脚本来读取警告并将这些内容添加到正确的文件以及所需的包含似乎有点过头了——尤其是因为我希望有人已经这样做(或类似的事情)。

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

4

2 回答 2

5

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

#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
}

显然,它可能会破坏作为模板参数传递的代码,short并且可能会在其他情况下破坏,因此请取消定义它破坏构建的位置。您可能需要添加运算符重载,以便通常的算术与包装器一起使用。

于 2013-02-06T22:00:45.087 回答
1

您可能可以为 gcc 编写一个插件来检测这些截断并发出对检查转换是否安全的函数的调用。您可以用CPython编写这些插件。如果你更喜欢使用 clang,它也支持编写插件

我认为最简单的方法是让插件将 unsafe cast from intto转换short为 call to a function _convert_int_to_float_fail_if_data_loss(value)。我将把它作为练习留给读者如何编写这样的插件。

于 2013-02-06T21:44:56.363 回答