記一個全域性變數"冒充"區域性變數引起的bug

lzprgmr發表於2013-07-18

看程式碼相當簡單直觀,覺得怎麼都不會出錯,可執行結果明明就是錯了 - 對著vim摸著腦袋就是想不出哪裡有問題,可去掉新加的程式碼,就又可以了。

沒辦法,只好祭出殺手鐗:一行一行註釋掉來觀察。。。

反映問題的程式碼段相當簡單:

if condition then
    local v = create_object(mpr)
    if condition2 then v.R = "fixedR" end
    return v.MP .. v.R
end

被影響的是和v同類的一些object,可是這個程式碼裡怎麼看都沒問題,v是被我改了,可那是local的啊,管我怎麼改對全域性都不會有影響。

當註釋掉這一行試了一下發現可以之後,帶著不可思議的心情,檢查起來,然後去看create_object()這個函式:

object_cache = {}
function create_object(mpr)
    if object_cache[mpr] then
        return object_cache[mpr]
    end
  
    local obj = split(mpr)
    object_cache[mpr] = obj
    return obj
end

原來我改的東西,不是local的,而是全域性的,放在一張全域性表的cache。。。

這裡為了提高效率,把處理過的東西cache起來了,create_object只要是相同的輸入,返回的都是同一個object。。。

 

 

相關文章