Ubuntu系統(tǒng)下C語言代碼檢查工具(Splint)

字號:

看一下下面的代碼(當然包括錯誤,以檢驗splint的功能):
    #include
    int main(int argc,char* argv[]){
    int a=100; /*沒有使用的變量*/
    int b[8];
    printf("Hello c\n");
    b[9]=100; /*明顯數組越界 */
    /* 用到了兩個為聲明的變量c和d/
    c=100;
    d=10;
    return 0;
    }
    現在可以用splint來檢查一下,為了檢驗是否可以檢測到數組越界,使用+bounds選項。
    splint hi.c +bounds
    輸出結果:
    hi.c: (in function main)
    hi.c:9:2: Unrecognized identifier: c
    Identifier used in code has not been declared. (Use -unrecog to inhibit
    warning)
    hi.c:10:2: Unrecognized identifier: d
    hi.c:4:6: Variable a declared but not used
    A variable is declared but never used. Use /*@unused@*/ in front of
    declaration to suppress message. (Use -varuse to inhibit warning)
    hi.c:7:2: Likely out-of-bounds store:
    b[9]
    Unable to resolve constraint:
    requires 7 >= 9
    needed to satisfy precondition:
    requires maxSet(b @ hi.c:7:2) >= 9
    A memory write may write to an address beyond the allocated buffer. (Use
    -likely-boundswrite to inhibit warning)
    hi.c:3:14: Parameter argc not used
    A function parameter is not used in the body of the function. If the argument
    is needed for type compatibility or future plans, use /*@unused@*/ in the
    argument declaration. (Use -paramuse to inhibit warning)
    hi.c:3:25: Parameter argv not used
    Finished checking --- 6 code warnings
    現在詳細看一下結果:
    檢查結果1:
    hi.c:9:2: Unrecognized identifier: c
    Identifier used in code has not been declared. (Use -unrecog to inhibit
    warning)
    hi.c:10:2: Unrecognized identifier: d
    hi.c:4:6: Variable a declared but not used
    A variable is declared but never used. Use /*@unused@*/ in front of
    declaration to suppress message. (Use -varuse to inhibit warning)
    這些應該是splint檢測到變量c和d沒有聲明。
    檢查結果2:
    hi.c:7:2: Likely out-of-bounds store:
    b[9]
    Unable to resolve constraint:
    requires 7 >= 9
    needed to satisfy precondition:
    requires maxSet(b @ hi.c:7:2) >= 9
    A memory write may write to an address beyond the allocated buffer. (Use
    -likely-boundswrite to inhibit warning)
    這些是檢查存在數組越界,因為吧b[8]的數組序號應該是7,而不是9,所以出現requires 7 >= 9;
    檢查結果3:
    hi.c:3:14: Parameter argc not used
    A function parameter is not used in the body of the function. If the argument
    is needed for type compatibility or future plans, use /*@unused@*/ in the
    argument declaration. (Use -paramuse to inhibit warning)
    hi.c:3:25: Parameter argv not used
    這些表明argc和argv變量聲明了,但是沒有使用。這個不是什么問題。
    如果小心使用splint,應該對于c語言的程序編寫有非常大的輔助作用!