验证乘法溢出的测试

时间:2017-08-30 01:37:31

标签: c++ c

我已经实现了以下函数来检测乘法是否溢出:

bool IsSafeMul(uint32_t x, uint32_t y) {
    uint32_t z = x * y;
    return (z >= x && z >= y);
}

我已经凭经验证实了这一点,但我想确保:

  1. 是否100%保证正常工作(即没有假阳性且没有假阴性)?
  2. 100%保证能否正常使用其他任何unsigned类型?
  3. 谢谢。

1 个答案:

答案 0 :(得分:1)

不,不能保证正常工作。例如,

var peer;
var nbcc = [];

function updatePeerConnections(){
    if (!id) return;
    if (!peer) {
        peer = new Peer(id,{key: '52hhtusf1t0rudi'});
        peer.on('open', function(conn) {
            console.log('new connection');
        });
        peer.on('connection', function(conn) {
            conn.on('open', function(){
                console.log('connected!');
                conn.on('data', function(data){
                    let o = JSON.parse(data);
                    console.log('updating car ' + o.i);
                    updateCarMarker(o.id,o.lat,o.lng);
                 });

            });            
            conn.on('error', function(err){
               console.log(err);
            });
            console.log(conn.open+': remote peer detected: '+conn.peer);
            conn.id = conn.peer;
            nbcc[conn.peer] = conn;
        });
        peer.on('error', function(err){
            console.log(err.type);
        });
        updateConnections();        
    } else {
       updateConnections();
    }
}

function updateConnections(){
    for (cm of Object.values(carMarkers)){
        if (cm.id!=id && !Object.keys(nbcc).includes(cm.id)){
            console.log('connecting to '+cm.id)
            nbcc[cm.id] = peer.connect(cm.id);
            nbcc[cm.id].id = cm.id;
            nbcc[cm.id].on('error', function(err){
                console.log(err);
            });
            nbcc[cm.id].on('open', function(){
                console.log('connected!');
                nbcc[cm.id].on('data', function(data){
                    let o = JSON.parse(data);
                    console.log('updating car ' + o.i);
                    updateCarMarker(o.id,o.lat,o.lng);
                 });
            });
        }
    }
}

截断到32位后产生0x000FFFFF * 0x000FFFFF = 0xFFFFE00001 ,通过测试。但乘法溢出。

要测试乘法上的溢出,您只需检查0xFFE00001提供的z / x == y不为零。