免費開始練習
司法三等申論題 114年 [檢察事務官電子資訊組] 程式語言

第 一 題

針對以下 C 程式碼,請先說明執行該程式之輸出,以及程式中函式 left()、right() 之運作功能;並請說明在 testGen() 測試 left()、right() 過程中,有那幾行指令未被充分測試。(25 分)
01 #include
02 #include
03 #include
04 char* left(char* data, int len, const char symbol) {
05 int dLen = strlen(data);
06 char* result = (char*)malloc(dLen + 1);
07 if (len > dLen) len = dLen;
08 strcpy(result, data);
09 for (int i = len; i < dLen; i++) result[i] = symbol;
10 return result;
11 }
12 char* right(char* data, int len, const char symbol) {
13 int dLen = strlen(data);
14 char* result = (char*)malloc(dLen + 1);
15 if (len > dLen) len = dLen;
16 strcpy(result, data);
17 for (int i = (dLen-len); i < dLen; i++) result[i] = symbol;
18 return result;
19 }
20 void testGen() {
21 char str[] = "abcdef";
22 char* left1 = left(str, 4, '@');
23 char* left2 = left(str, 8, '@');
24 char* right1 = right(str, 4, '@');
25 printf("%s\n", left1);
26 printf("%s\n", left2);
27 printf("%s\n", right1);
28 free(left1);
29 free(left2);
30 free(right1);
31 }
32 int main() {
33 testGen();
34 return 0;
35 }
📝 此題為申論題

思路引導 VIP

  1. 首先追蹤 leftright 的迴圈邏輯,注意字串索引與 symbol 替換的範圍,並逐步寫出 testGen 內三個函式呼叫的字串輸出。
  2. 接著對比測試參數 (4, 8, 4) 與函式內的條件式 (len > dLen),檢視是否有特定分支(True/False)從未被觸發,藉此找出缺乏分支涵蓋率(Branch Coverage)的程式碼行號。
🤖
AI 詳解 AI 專屬家教

【破題】 本題考查 C 語言字串操作、指標與動態記憶體配置的執行追蹤,同時藉由檢視測試案例評估程式碼的分支涵蓋率(Branch Coverage),以找出缺乏測試的特定指令。 【論述】

▼ 還有更多解析內容
📝 C 字串操作與分支涵蓋率
💡 透過執行追蹤驗證字串邏輯,並以分支涵蓋率評估測試案例的完整性。
比較維度 left() 函式測試 VS right() 函式測試
測試案例數量 2 個 (len=4, len=8) 1 個 (len=4)
條件 True 分支 已執行 (len=8 > dLen) 未執行 (需 len > 6)
條件 False 分支 已執行 (len=4 < dLen) 已執行 (len=4 < dLen)
涵蓋率評價 充分涵蓋 不充分 (缺失第 15 行)
💬left() 完整測試了邊界防護,right() 則漏掉 len 大於字串長度的極端情況。
🧠 記憶技巧:算長度、配記憶、迴圈索引要對齊;有分支、測兩端、覆蓋完整才安心。
⚠️ 常見陷阱:容易忽略 right() 函式缺乏 len > dLen 的測試案例,導致條件成立的分支(第 15 行內部的賦值)未被執行,這是軟體測試中最常見的盲點。
記憶體洩漏 (Memory Leak) 白箱測試 (White-box Testing) 邊界值分析 (BVA) 指標與字串陣列

🏷️ AI 記憶小卡 VIP

AI 記憶小卡

升級 VIP 解鎖記憶小卡

考前複習神器,一眼掌握重點