יום שישי, אוגוסט 14, 2015

ולפעמים קוד פורטאבלי חוזר לנשוך אותך בתחת

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


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


הנה דוגמת הקוד הבאה שאיננה עובדת יותר לאחר הוספת פיטצר חדש בקומיילר  :
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <sys/stat.h>
#include <string.h>

int  main(int argc,char *argv[])

{
        struct stat file_path_stat_result;
        const char *file_path;

        file_path = argv[1];

        if (argc != 2) {
                fprintf (stderr,"Usage %s <pathname>\n",argv[0]);
                return EXIT_FAILURE;
        }

        if (0 != stat (file_path,&file_path_stat_result)) {
                fprintf(stderr,
                        "%s (%s:%4.4d) for pathname <%s> : %s\n",argv[0],
                        __FILE__,__LINE__,file_path,strerror(errno));

                return EXIT_FAILURE;
        }

        printf ("%s (%s:%4.4d) filepath <%s> mode %ld\n",argv[0],__FILE__,__LINE__,file_path ,file_path_stat_result);

        return 0;

}

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

הפיטצר המדהים שהוצג ב VS 2015 בגדול אומר כי כל מה שיקומפל עם VS 2015 ידרוש שה universal crt ביחד עם מספר מתנות יהיה מותקן על המערכת , הם אף מוסיפים ואמורים כי עבור אנשים שמפיצים את ה VC redist שום דבר לא צריך להשתנות והם ממשיכים לעבוד באותה הצורה (אחרים שיש להם windows update אין להם שום בעייה בנושא).

החלק הנוראי בכל הסיפור שבגלל שהקוד עובר קומפלציה ולינק אין לך שום דרך לדעת שזה לא הולך לעבוד יותר.
והנה קיבלתי באג הזויי (שכמובן לא הצלחתי לשחזר בהתחלה בשום מקום אחר)  באחד הפרוייקטים שאני עובד בהם :חפירה של כשעה הבעיה אותי להבנה כי הרבה מפקודות המערכת הבסיסיות אינן עובדות יותר (דוגמאות stat, access ) יתקבל errno 22 (הפונקציה איננה נתמכת במערכת זו).

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

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

אין לי בעייה (בעצם יש זה המון עבודה לחינם) כל עוד אני יכול לשנות את הקוד ולננק הבעיה שלי זה עם חבילות בינאריות (ירימו את היד אלה שעובדים בתקשורת ושתמיד מקבלים dllים ו libים  ביחד עם קוד מקור)

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

( פרל ) החברים הטובים עם הגמל פתרו בעייה זו עבור ע"י לינקוק ישיר.


(פייתון) הבחרים הטובים עם הקשר המוזר לנחש פשוט התחילו לשכתב קוד בשביל לעבוד עם הקומפיילר החדש.

תודה לאל אני לא צריך לעקוב אחרי מה קורה ב PHP נכון לעכשיו אבל אם יש לך WAMP על windows xp (לדוגמה) יש מצב שתבלה מספר לילות בדיבוג של PHP להבין למה סביבת הפרודקשיין שלך הפסיקה לעבוד כמו שצריך. 

בגלל שלא ראיתי שום התייחסות לנושא ברשומות תפוצה של pidgin (ואני לא ממש עוקב אחרי מה שהולך ב libreoffice) אני לא הולך לשדרג אותם בקרוב (וחבל).

אז למי שיש גישה ל windows xp והוא משתמש בפרוייקטים שהם קוד פתוח נסו גירסה חדשה שקופלה עם VS 2015 וזכרו לדווח באגים בפרוייקטים האוהבים עליכם.

אין תגובות:

הוסף רשומת תגובה