هل تريد تعطيل رسائل التحذير في دول مجلس التعاون الخليجي من خلال ملفات الرأس؟
سؤال
أنا أستخدم الوظيفة 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()
.
في التعليمات البرمجية الموجودة، لتحل محل 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");
}