2008-04-24

程式撰寫規範 [part 4]

Topic :

在同一項目組應明確規定對界面function參數的合法性檢查應由function的調用者負責還是由界面function本身負責,default是由界面function本身負責。一般在界面function內使用ASSERT()來檢查。

Description :

對於模塊間界面function的參數的合法性檢查這一問題,往往有兩個極端現象,即:要么是調用者和被調用者對參數均不作合法性檢查,結果就遺漏了合法性檢查這一必要的處理procedure,造成問題隱患;要么就是調用者和被調用者均對參數進行合法性檢查,這種情況雖不會造成問題,但產生了冗餘程式碼,降低了效率。

Example:

/*
* sample-72
*
* This sample shows how to use assert function,
* and where is placed better.
*
*/

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

#define assert(expr) \
    ((void) ((expr) || \
    my_assert(__STRING(expr), __FILE__, __LINE__)))

int my_assert(char* expr, char* file, int line) {
    printf("Assertion failed (assert(%s)) in %s:%i\n", expr, file, line);

    exit(1);
    return (1);
}

void bar(char *bar_str){
    char str[20];
    assert(bar_str);        // use assert function to avoid unpredictable result
        strcpy(str, bar_str);
    printf("str : %s\n", str);
}

void foo(){
    char *str = NULL;
    // you can check "str" before call bar()
    // but it may cause redundant code
    bar(str);
}

int main(int argc, char* argv[]){
    foo();
    return 0;
}

 

這個 sample 解釋了 assert的使用。

沒有留言:

張貼留言