هل تريد تعطيل رسائل التحذير في دول مجلس التعاون الخليجي من خلال ملفات الرأس؟

StackOverflow https://stackoverflow.com/questions/1214365

سؤال

أنا أستخدم الوظيفة gets() في رمز C الخاص بي.الكود الخاص بي يعمل بشكل جيد ولكني أتلقى رسالة تحذير

(.text+0xe6): warning: the `gets' function is dangerous and should not be used.

أريد ألا تظهر رسالة التحذير هذه.هل هناك أي طريقة؟

أتساءل أنه قد تكون هناك مثل هذه الاحتمالات عن طريق إنشاء ملف رأس لتعطيل بعض التحذيرات.أم أن هناك أي خيار أثناء التجميع يمكن أن يخدم غرضي؟أو ربما هناك طريقة معينة للاستخدام gets() لهذا التحذير لا يطفو على السطح؟

هل كانت مفيدة؟

المحلول

والجواب الواضح هو أن نتعلم من ما المترجم يحاول أن أقول لكم - يجب عليك أبدا، من أي وقت مضى، ويحصل على استخدام ()، كما أنها غير آمنة تماما. استخدام fgets () بدلا من ذلك، والذي يسمح لك لمنع التجاوزات عازلة محتملة.

#define BUFFER_SIZE 100
char buff[BUFFER_SIZE];
gets( buff);   // unsafe!
fgets( buff, sizeof(buff), stdin );   // safe

نصائح أخرى

إذا كنت تريد حقا استخدامه.

هنا الجواب من: http://www.gamedev.net/community/forums/topic.asp?topic_id=523641

إذا كنت تستخدم إصدارًا حديثًا إلى حد معقول من gcc، فيمكنك استخدام:

#pragma GCC diagnostic ignored "your option here"

على سبيل المثال، إذا كانت هذه الرؤوس تنتج خطأ "مقارنة الفاصلة العائمة غير آمنة"، فيمكنك استخدام:

#pragma GCC diagnostic ignored "-Wfloat-equal".

لسوء الحظ، لا يمكنك تعطيل "-Wall" بهذه الطريقة (سيكون ذلك سهلاً للغاية، أليس كذلك...)، عليك القيام بخيارات التحذير الفردية التي يتيحها -Wall يدويًا (على الأقل، الخيارات المتعارضة).

المستندات: http://gcc.gnu.org/onlinedocs/gcc/Diagnostic-Pragmas.html#Diagnostic-Pragmas

يحرر: ولكن يبدو أن الأمر لا يعمل للحصول على تحذير ...حاولت على جهاز الكمبيوتر الخاص بي.

وأود أن تستجيب للتحذير واستبدال gets. وهذا واضح بما فيه الكفاية بالنسبة لي:

<اقتباس فقرة>   

والبق

     

لا تستخدم أبدا يحصل على (). لأنه من المستحيل أن أقول دون معرفة البيانات في   تقدم عدد الحروف يحصل () سوف تقرأ، ولأن يحصل على () سوف تستمر لتخزين   الأحرف بعد نهاية المخزن المؤقت، فإنه أمر خطير للغاية لاستخدام. لديها   تم استخدامها لكسر أمن الكمبيوتر. استخدام fgets () بدلا من ذلك.

استخدم fgets() بدلاً من gets()

char buffer[BUFSIZ];
/* gets(buffer); */
fgets(buffer,sizeof(buffer), stdin);

لا تتحقق وظيفة gets() من طول المخزن المؤقت ويمكنها الكتابة بعد النهاية وتعديل المكدس.هذا هو "تجاوز سعة المخزن المؤقت" الذي تسمع عنه.

وهناك حقا أي سبب وجيه لاستخدام gets(). حتى يقول معيار C انها الزائل! استخدام fgets() بدلا من ذلك.

[تحرير]

ويبدو أن التحذير يأتي من رابط. هل تحصل التحذير عند ترجمة مع -c؟ (مما يؤدي إلى تعطيل الارتباط.)

ويجب عدم استخدام وظيفة gets على الإطلاق، يقول manpage استخدام fgets بدلا من ذلك.

ودول مجلس التعاون الخليجي لا يوفر الوظائف التي لا دول مجلس التعاون الخليجي لتعطيل تحذيرات باستخدام pragmas. يجب عليك استخدام مختلف كما أعلام ل مترجم بدلا من ذلك.

واقتراح بديل آمن للgets().

في التعليمات البرمجية الموجودة، لتحل محل gets()، فإنه قد لا يكون المطلوب لاستخدام fgets() كما تتطلب الدالة على char إضافية لإنقاذ '\n' التي تستهلك كل من وظائف، ولكن gets() لا يحفظ. وفيما يلي بديلا التي لا تتطلب أكبر حجم المخزن المؤقت.

وكل gets(dest) هو استبدال:
إذا dest هو صفيف، استخدام gets_sz(dest, sizeof dest)
إذا dest هو مؤشر إلى مجموعة char من حجم n، واستخدام gets_sz(dest, n)

char *gets_sz(char *dest, size_t size) {
    if (size <= 1) {
        if (size <= 0 || feof(stdin)) {
            return NULL;
        }
    }
    size--;
    size_t i;
    for (i = 0; i < size; i++) {
        int ch = getchar();
        if (ch == EOF) {
            if (i == 0)
                return NULL;
            break;
        }
        if (ch == '\n')
            break;
        dest[i] = (char) ch;
    }
    dest[i] = 0;
    return dest;
}

إذا كنت تريد حقا لاستخدامه، حاول -fsyntax-only العلم.

والدليل في موقع دول مجلس التعاون الخليجي يقول:

<اقتباس فقرة>   

و-fsyntax-only

Check the code for syntax errors, but don't do anything beyond that.

و-fno-stack-protector هو الخيار الذي يسمح للوظيفة gets() لاستخدامها بالرغم من ما هو غير آمنة.

و-Wno-deprecated-declarations إيقاف التحذير انتقاص

وهنا مثال على ترجمة مع gets()

gcc myprogram.c -o myprogram -fno-stack-protector -Wno-deprecated-declarations

وأنا أتفق مع كل من يقول بأنه غير آمن تماما لأنه سيسمح برنامج لتجاوز منطقة عازلة. هذا يمكن ان يكون خطيرا جدا وبالتالي سبب قد تم إهمال في صالح fgets.

ولكن، إذا كنت أخذ مقدمة إلى دورة الأمن، والقدرة على كتابة برنامج اختبار صغير للعب مع مفاهيم تجاوز سعة المخزن المؤقت وتجاوزات كومة من المفيد جدا.

وخلافا للرأي السائد، وليس كل المبرمجين تفريط بالتساوي على ما يكتب. سوف gets() يكون دائما القياسي في C90، ووضعها في المكتبة لعدة أسباب وجيهة. انها لا أكثر "خطير" من أي وظيفة سلسلة أخرى عند استخدامها بشكل مناسب، كما هو الحال في الأمثلة البرنامج، وثائق والسقالات وحدة الاختبار، والواجبات المنزلية، وغيرها.

ما هو أكثر من ذلك، gets() يعزز القراءة بطريقة fgets() سوف أبدا. واحد أبدا أن يقطع المرء قطار الفكر للبحث عن ما أجل وضع حججه في.

والحل التالي يستخدم مهمتي المفضلة الأخرى لإزالة السطر الجديد. :)

 #define gets GET_LOST
 #include "stdio.h"
 #undef gets

 #include "limits.h"

 char *gets(char *s)
 {
    return strtok(fgets(s, INT_MAX, stdin), "\n");
 }
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top