קוד מקור: Legacy C Code

קוד Legacy C, לעתים קרובות כמה עשורים, יוצר את עמוד השדרה של אינספור מערכות משובצות, מערכות הפעלה ויישומים ארגוניים.קודים אלה נכתבו במקור תחת מגבלות של זיכרון מוגבל, מעבדים איטיים, ושרשרת כלים פרימיטיבית.בעוד שהם עשויים לתפקד באופן אמין, הם בדרך כלל מחזיקים שורה של בעיות: משתנים גלובליים מפוזרים על פני מודולים, מצבי קינון עמוק, מספרי קסם, והסתמכות כבדה על פלטפורמות ספציפיות של פלטפורמות.

לפני נגיעה לקו אחד, הבנה מעמיקה של המערכת הקיימת אינה ניתנת להשגה.קרא את המסמכים (אם היא קיימת), לראיין מומחי דומיין, ולנהל את הקוד תחת פענוח כדי לצפות בזרימת הביצוע שלו.מפות את התלויות של המודול ולסמן אילו חלקים הם קשים ל חומרה או מערכת הפעלה מסוימת.שלבי התחדשות אלה מונעים הפסקות מקריות ומסייעים לחידוש המאמצים.

אסטרטגיות לשיפור יעיל

האסטרטגיות הבאות מהוות מסגרת שיטתית למודרניזציה של קוד מורשת C. כל גישה מפחיתה את החוב הטכני תוך שמירה על פונקציונליות הליבה של התוכנה.

1 ביצוע קוד מקיף

(הופנה מהדף ביקורת קוד מזהה את נקודות הכאב המדויקות.) השתמש בכלים ניתוח סטטי כדי לזהות באגים באופן אוטומטי, פרצות אבטחה, והפרות של תקני הקידוד המודרניים.לדוגמה, FLT:0Cpp ChecksFLT:1 תופסות אפס נקודות קצה, buring overflows, ו- unuses.F: 2Clang StLTic Analyzeralph מספק דרך קוד רגישה יותר ו-R.

במהלך הביקורת, גם לבדוק את מערכת הבנייה.מודרניזציה Makefiles או CMakeLists לתמוך איסוף חוצה פלטפורמות ומאפשר אזהרות מפרש כגון FLT:0. מסמך האדריכלות וליצור גרף תלותי - זה ינחה את מאמצי המודוליזציה מאוחר יותר.

2.הקימו סטנדרטים מודרניים

אימוץ תקן קידוד מוכר כדי להביא עקביות על פני בסיס הקוד.ה-FLT:0MISRA C ReferencesFLT:1 (בדרך כלל בשימוש במערכות רכב וביקורת בטיחות) להפחית התנהגות בלתי מוגדרת ולשפר את יכולת הקריאה. עבור פרויקטים למטרות כלליות, לדבוק תקן C האחרון - לפחות C11, רצוי C17.

(הופנה מהדף קונבנציות (למשל, FLT:2 לפונקציות ומשתנים, ⁇ 3) עבור מאקרו), הזדהות (התראות לעומת מקומות), וסגנון תגובה (שימוש ב-Doxygen או דומה) לכפות כללים אלה באמצעות linter כגון linter כגון FLT:0clang-tidyFLT:1 בצנרת האינטגרציה הרציונאלית שלך.

3.התאמת הקוד

לעיתים קרובות, Legacy C מכיל פונקציות מונוליטיות המשתרעות על פני מאות או אלפי שורות.Break them into Small, cohesive function שכל אחד מהם עושה דבר אחד. השתמש בקבצי ראש כדי להכריז על ממשקים ציבוריים וקבצים מקור ליישום.לדוגמה, לחלק קובץ שטופל גם ברשת וגם קובץ I/O למודולים נפרדים של FLT:4/FLT:5 ו-FLT:6/FLT 7.

המודולריות פירושה גם צמצום המשתנים הגלובליים.החלפתם עם המדינה המקומית שעברה באמצעות טיעונים פונקציונליים או (FLT:8 נקודות נקודה.זה הופך להיות תלויות מפורשות ובדיקת יחידה לאפשרות.לכיר סוגים (הכרזות מתקדמות בראש, הגדרות רק ב-FLT:9 קבצים) כדי להסתיר את פרטי היישום.

// Before: monolithic, global state
int buffer[256];
int index = 0;
void process_data() { /* manipulates global buffer and index */ }

// After: encapsulated module
// buffer.h
typedef struct Buffer Buffer;
Buffer* buffer_create(size_t size);
int buffer_push(Buffer* b, int value);
void buffer_destroy(Buffer* b);

// buffer.c
struct Buffer {
 int* data;
 size_t size;
 size_t index;
};
Buffer* buffer_create(size_t size) { ... }

4.החלפת פונקציות ממוקדות ובלתי בטוחות

ספריית C סטנדרטית מכילה כמה פונקציות לא בטוחות לשמצה כי הם או מרתיעים בקידוד מאובטח מודרני. להחליף אותם באופן שיטתי:

  • [01: 12]
  • (ב) , (ב) , (ב) , ⁇ ⁇ ⁇
  • (ב) , (ב) , (ב) , ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇
  • (ב) [15]
  • [22: 22]
  • (ב) ◄
  • (ב) ,(ב) ,(ב) ,(ב) ,(ב) ,(ב) , ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ).

שינויים אלה מבטלים את התגברות הבקר, מקור עיקרי לפגיעות אבטחה.בנוסף, להשבית את הפונקציות הישנות על ידי הגדרת FLT:28 על Windows או באמצעות דגלים מדגמים אשר מתייחסים לפונקציות מחוסמות כשגיאות.

שיפור ניהול הזיכרון

הקצאת זיכרון דינמי במורשת C היא לעתים קרובות בעיות שגיאה-prone. Common כוללות שכחה חינם, כפול חינם, ונקודות קצה.ספק ניהול זיכרון עם שיטות אלה:

  • (ב) במקום ב[[1924]], כאשר יש צורך בזיכרון אפס-נינטלי.
  • תמיד לבדוק את ערך ההחזר של פונקציות הקצאה עבור FLT:31.
  • יצירת פונקציות עטיפה המעקב אחר הקצאות (למשל, FLT:32) אשר זוחלות על כישלון.
  • אימוץ מודל בעלות עקבי: מסמך אשר פועל הבעלים של הזיכרון והוא אחראי על שחרורו.
  • השתמש בכלים כמו FLT:0 ;ValgrindFIRLT:1 (Memcheck) או כתובת Sanitizer (ASan) כדי לזהות דליפות ו- Out-of-bounds Accesses במהלך בדיקות.

בסעיפים קריטיים בביצוע, שקול להשתמש בכופים סטטיים או בכלאודורי זירה כדי להימנע מפיצול ולמעלה.עבור מערכות משובצות עם זיכרון מחוספס, להחליף הקצאה דינמית עם בריכות שהוגדרו מראש.

6 אימוץ בטוח יותר פוינטר

המצביעים הם חרב כפולה, מודרניזציה של השימוש שלהם כדי להפחית את הסיכוי של באגים:

  • השתמש בפרמטרים פונקציונליים שאינם משתנים.זה הופך את החוזה ברור יותר ומסייע לאופטימיזציה של ה-Matr.
  • נציין את הטיפים לחפצים שאינם קשורים ל-FLT:34 (C99 ואילך) זה מאפשר וקטוריזציה טובה יותר.
  • להימנע מפגיעה באיסור על נטיעתה של מדרשה, במקום להשפיל את ה[[המאה ה-20]], כדי להימנע מהפרות חמורות.
  • החלפה של מצביעה על פונקציות עם מצביעי תפקוד מכוונים כראוי כדי למנוע התנהגות בלתי מוגדרת.
  • השתמש במערך גמיש (C99) במקום ב-FLT:37 (ערכים גדולים בסוף ה-UV).
// Avoid: casting void* to misaligned type
int value = *(int*)(byte_buffer + offset); // potential UB

// Prefer: memcpy
int value;
memcpy(&value, byte_buffer + offset, sizeof(value));

שיפור שגיאות

Legacy C משתמשת לעיתים קרובות בתערובת של קודי החזרה, וטעייה גלובלית קובע.אחד את השגיאה טיפול בדפוס עקבי.

  • השתמש בסוגי החזרה לפונקציות (למשל, FLT:40).
  • להימנע מחזרה (FLT:41) עבור קודים שגיאה; חתומה על חומרים המאפשרים ערכים שליליים עבור שגיאות.
  • עבור מערכות מורכבות, ליישם דפוס יוצא דופן קל משקל באמצעות FLT:42 / איור / FLT:43 (אך להשתמש בשפע, כפי שהם מסבך שליטה על זרימה).
  • כוונו שגיאות ברמה גבוהה ומשאבים ללא רוח באמצעות דפוסים (בצדק) כדי להימנע מקוד ניקוי חוזר.

בדיקה אחרונה ב-8.

ללא בדיקות, שינוי הוא מפחיד.הגדרת מסגרת בדיקות יחידה מוקדם.הבחירות הפופולריות עבור C כוללים:

  • (ב) ,0) ,UnityofLT:1 , משקל, אידיאלי עבור מערכות משובצות.
  • (ב) ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇
  • CUnit - מסורתי אך פונקציונלית.

כתוב בדיקות יחידה עבור כל מודול מספק. השתמש בפיתוח מונחה בדיקה (TDD) שבו ניתן: לכתוב את הבדיקה המגדירה את ההתנהגות הרצויה, ולאחר מכן לספק מחדש עד שהמבחן יעבור.בדיקות אינטגרציה צריכות להפעיל את המערכת כולה עם קלטות ידועות ופלטים צפויים.אוטומטיים את כל הבדיקות בסביבה CI כדי לתפוס רגרסנסים באופן מיידי.

9.התראות של

מתן לעתים קרובות משפר את הביצועים, אבל זה יכול גם להציג מעל (למשל, יותר קריאות פונקציה, דמי הקצאת זיכרון עטוף) פרופיל לפני ואחרי שינויים באמצעות כלים כגון FLT:45:45, FLT:46, או Xcode Instruments. Focus אופטימיזציה על נתיבים חמים. Enable קידוד מודרני אופטימיזציה (FLT:47 או FLT:48) ודגלים ספציפיים (Feloturedows) עם פונקציות סטנדרטיות, כולל, עם עלויות ייצור (FLT) ותפקודים עתידיים, כולל, עם עלויות ייצור, עם עלויות סטנדרטיות).

בדיקות ואימות

אסטרטגיה של בדיקות שלב היא קריטית כאשר שינוי קוד מורשת.עקוב אחר השלבים הבאים:

  1. (FLT:0) בדיקות רגרסיה (Regression TestingFLT:1) - הפעל את חבילת המבחן הקיימת (אם בכלל) לפני ביצוע שינויים להקמת קו בסיס.
  2. (FLT:0) אימות מצטבר של ההרחבה 1 (FLT:1) - מספק מודול אחד בכל פעם.לאחר כל שינוי, החל דגלים קפדניים ובדיקות הפעלה יחידה. השתמש בשליטה בגירסה (למשל, Git) עם מבצעים קטנים ואטומיים כך שתוכל לחזור בקלות.
  3. (FLT:0) ניתוח סטטית שילוב FLT:1 - הוסף Cppcheck ו clang-tidy לצנרת שלך. לטפל אזהרות כשגיאות לאכיפת איכות.
  4. (ב) ,0) ניתוח דינמיט (FLT:1) - לרוץ תחת Valgrind או Aסן במהלך הלילה בונה כדי לזהות בעיות זיכרון שהוצגו על ידי מתן מחדש.
  5. (FLT:0User קבלה TestveFLT:1) - ניתוק המערכת המחודשת לסביבה ממריץ ויש להם מומחי דומיין לבצע בדיקות מקצה לקצה.השוואה בין יומני פלט, תזמון ושימוש משאבים עם המקור.

אוטומטי שלבים אלה עם שרת CI (GitHub Actions, ג'נקינס, GitLab CI) מקטין את המדריך מעל פני הראש ונבנה אמון בתהליך השיפוץ.

מסקנה

מתן קוד מורשת C הוא לא פרויקט חד פעמי, אלא משמעת מתמשכת.על ידי ביצוע ביקורת יסודית, הקמת סטנדרטים מודרניים, מודולר בסיס הקוד, החלפת פונקציות לא בטוחות, שיפור ניהול הזיכרון, ואכיפת בדיקות קפדניות, מפתחים יכולים להפוך מונוליטית שברירית למערכת חזקה, שמירה על עצמה, את בסיס ההשקעה בשיעורי פגם מופחתים, מהר יותר על גבי לוח עבור חברים חדשים, חלקה ואינטגרציה עם כלים מודרניים, החל היום, לענות על תוכניות אבטחה קטנות.